Android App/Kotlin
Activity(***서브 액티비티 종료 시 메인 액티비티에 값 돌려받기)
AppJinny
2022. 11. 9. 05:36
*Activity(***서브 엑티비티 종료 시 메인 엑티비티에 값 돌려받기)
-서브액티비티 종료 시 메인 액티비티에 서브액티비티에서 입력받은 값 출력하기
[메인 액티비티]
-activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="Main Activity"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sub Activity Start"
android:layout_marginTop="24dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<!-- 받아온 text값 보여줄 텍스트뷰 -->
<TextView
android:id="@+id/resultView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="결과 값 출력"
android:layout_marginTop="50dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnStart" />
</androidx.constraintlayout.widget.ConstraintLayout>
-build.gradle
-- android{} 에 뷰바인딩 추가
//뷰바인딩
buildFeatures{
viewBinding true
}
-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)
//서브액티비티 값 돌려받기
//기존 onActivityResult()는 안정성 문제로 2020년 10월 부터 deprecated목록 추가
//ActivityResultContracts 방식 사용
//서브 액티비티에서 돌려준 값을 activityResult변수에 저장
//registerForActivityResult(){} 메서드 작성
//ActivityResultContracts 방식을 사용한 액티비티에서 받은 값 받아오기
//ActivityResultContracts.StartActivityForResult()
//참고 URI : https://developer.android.com/reference/kotlin/androidx/activity/result/contract/ActivityResultContracts
val activityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
//서브액티비티에서 돌려받은 resultCode가 정상인지 체크
if (it.resultCode == RESULT_OK){
//정상이라면 돌려받은 인텐트에서 키 값을 사용해서 메시지를 꺼내(it.data?) 변수에 저장 getStringExtra("키 값")
val message = it.data?.getStringExtra("returnValue")
//토스트 출력
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
//로그 출력
Log.d("message","$message")
//텍스트 뷰 변경
binding.resultView.text = message
}
}
//버튼을 클릭하면 인텐트 실행, 서브액티비티 실행
//btnStart.setOnClickListener { startActivity(intent) }
//startActivity()메서드로 실행된 액티비티에서는 값을 돌려받을 수 없음
//값을 돌려받고 싶을 때 activityResult변수의 launch()메서드를 사용해야 함
binding.btnStart.setOnClickListener { activityResult.launch(intent) }
}//onCreate
}//MainActivity
-ActivityResultContracts 방식 사용 참고 : https://developer.android.com/reference/kotlin/androidx/activity/result/contract/ActivityResultContracts
[서브 액티비티]
-activity_sub.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SubActivity">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="Sub Activity"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!-- 전달할 메시지 입력받는 창 생성 -->
<EditText
android:id="@+id/editMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="전달할 메시지를 입력하세요"
android:layout_marginTop="32dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" />
<!-- 액티비티 닫기 버튼 생성 -->
<Button
android:id="@+id/btnClose"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="액티비티 닫기"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editMessage" />
</androidx.constraintlayout.widget.ConstraintLayout>
-SubActivity.kt
class SubActivity : AppCompatActivity() {
//뷰바인딩
val binding by lazy { ActivitySubBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//뷰바인딩
setContentView(binding.root)
//서브 액티비티 종료 버튼을 누를 때 자신을 호출했던 메인 액티비티로 값을 돌려주고 액티비티 종료
binding.btnClose.setOnClickListener {
//호출한 메인 액티비티에 돌려줄 인텐트 생성 후 변수 resultIntent 에 저장
//인텐트를 돌려줄 때는 대상을 지정하지 않아도 되므로 Intent()안에 아무것도 담지 않음
val resultIntent = Intent()
//에디트텍스트뷰의 아이디 editMessage에 입력받은 (.text.)텍스트 값을
//toString()하여 텍스트로 받아와서
//변수 resultIntent에 값 저장(putExtra())
resultIntent.putExtra("returnValue",binding.editMessage.text.toString())
//호출한 측으로 변수 resultIntent에 저장된 값과 상태값 전달
//호출한 측으로 전달하는 메서드 : setResult(상태값, 전달할 인텐트)
//상태값 : RESULT_OK, RESULT_CANCELED 상수로 정의되어 있음
//처리한 결과값에 따라 성공이면 OK, 취소되었으면 CANCELED 사용
setResult(RESULT_OK, resultIntent)
//액티비티 종료 : finish()
finish()
}
}//onCreate
}//SubActivity
-결과
이 포스팅에 작성한 내용은 고돈호, ⌜이것이 안드로이드다⌟, 한빛미디어(주), 2022 에서 발췌하였습니다.