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 에서 발췌하였습니다.