MainActivity에서 SubActivity로 전환 해주기 위해서 SubActivity를 만들어 주어야 합니다.
프로젝트 파일에서 왼쪽 클릭을하여 Empty Activity를 생성해줍니다.
Activity Name과 Layout Name은 편하실대로 지어주시면 됩니다.
Main Activity에서 Sub Activity로 넘어가주기 위해서 버튼을 하나 배치해줍니다.
전환될 Sub Activity도 아래와 같이 배치 해줍니다.
인제 전환될 화면 구성이 완료 되었으니 코드를 작성해 주어야 겠죠?
우선 뷰 바인딩을 위해 아래와 같이 설정 해줍니다.
build.gradle (Module)에 들어가서 buildFeatures안에 view Binding true로 설정해줍니다.
class MainActivity : AppCompatActivity() {
val binding by lazy {ActivityMainBinding.inflate(layoutInflater)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
val intent = Intent(this, SubActivity::class.java)
binding.button.setOnClickListener{startActivity(intent)}
}
}
그 후 button 리스너를 등록해 버튼을 누르면 startActivity 메서드가 실행되게 해줍니다.
[결과]
액티비티와 같은 컴포넌트는 인텐트에 실행 메시지를 전달도하지만,
인텐트의 번들이라는 데이터 저장 공간을 이용하면 액티비티간 데이터를 주고 받을 수 있습니다.
자바의 HashMap과 같이 Key, Value로 담아서 보내는 것과 유사합니다.
MainActivity.kt
class MainActivity : AppCompatActivity() {
val binding by lazy {ActivityMainBinding.inflate(layoutInflater)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
val intent = Intent(this, SubActivity::class.java)
intent.putExtra("Data1", "Hello World")
intent.putExtra("Data2", 2018)
binding.button.setOnClickListener{startActivity(intent)}
}
}
SubActivity.kt
class SubActivity : AppCompatActivity() {
val binding by lazy{ActivitySubBinding.inflate(layoutInflater)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.DataTextView1.text = intent.getStringExtra("Data1")
binding.DataTextView2.setText("${intent.getIntExtra("Data2",0)}")
}
}
Data2의 value는 Int형 데이터 이기 때문에 문자열 템플릿 (${}) 을 사용해서 문자열로 변환 해주어야 합니다.
getIntExtra()의 두 번째 피라미터는 기본 값입니다.
특별한 경우가 아니라면 0을 입력하고 사용합니다.
[결과]
메인 액티비티에서 값 돌려받기
SubActivity를 아래와 같이 배치해줍니다.
SubActivity.kt
class SubActivity : AppCompatActivity() {
val binding by lazy{ActivitySubBinding.inflate(layoutInflater)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.DataTextView1.text = intent.getStringExtra("Data1")
binding.DataTextView2.setText("${intent.getIntExtra("Data2",0)}")
binding.closeButton.setOnClickListener {
val returnIntent = Intent()
returnIntent.putExtra("returnValue", binding.editMessage.text.toString())
setResult(RESULT_OK, returnIntent)
finish()
}
}
}
setResult() 메서드에 returnIntent와 상태 값을 담아서 실행하면 호출한 측으로 전달 됩니다.
상태 값은 RESULT_OK와 RESULT_CANCELED로 안드로이드에 이미 상수로 정의 되어 있습니다
finish() 메서드를 호출하면 서브 액티비티가 종료 되면서 메인 액티비티에 값이 전달 됩니다.
그 후 MainActivity에서 값을 전달 받기 위한 코드를 작성해줍니다.
class MainActivity : AppCompatActivity() {
val binding by lazy {ActivityMainBinding.inflate(layoutInflater)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
val intent = Intent(this, SubActivity::class.java)
intent.putExtra("Data1", "Hello World")
intent.putExtra("Data2", 2018)
binding.button.setOnClickListener{startActivityForResult(intent,99)}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode == RESULT_OK){
when(requestCode){
99 -> {
val message = data?.getStringExtra("returnValue")
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
}
}
}
}
[결과]
'Android' 카테고리의 다른 글
Android - Mac북 에뮬레이터 인터넷(와이파이 안될 경우) (1) | 2022.08.04 |
---|---|
Android BottomNavigation Bar Round효과 (0) | 2022.08.02 |
[Android ]Progress Bar - Kotlin (0) | 2022.07.25 |
[Kotlin] 코틀린에서의 변수 사용법 (2) | 2022.07.07 |
코틀린으로 레이아웃 연결하기 (뷰 바인딩) (0) | 2022.07.04 |