안드로이드 스튜디오~

StartActivityForResult

임종뚱 2020. 1. 5. 23:22

오늘은 StartActivityForResult를 통해 값을 얻어올 것이다.

 

우선 startactivity() 메서드와 startActivityForResult() 메서드의 차이를 알아야 할 것이다.

startactivity()메서드는 단순히 어떤 액티비티를 시작하기 위한 용도로 사용되며

startActivityForResult()메서드는 단순히 액티비티를 시작하는 것만이 아닌 시작한 액티비티를 통해 어떠한 결과 값을 받아오기 위해 사용하는 것이다.

 

 

간단하게 레이아웃을 설정해보자

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="값을 가져와 주세요"
        android:textSize="30sp"
        android:id="@+id/tv_comback"/>

    <Button
        android:id="@+id/btn_go"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="go"/>
</LinearLayout>

메인 액티비티 레이아웃을 설정해 주었고

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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">

    <EditText
        android:id="@+id/et_comback"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="메인으로 보낼 값을 입력해 주세요"/>

    <Button
        android:id="@+id/btn_close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="종료"/>

</LinearLayout>

서브 액티비티 레이아웃을 설정했다 서브 액티비티의 EditText 값을 입력해 주고 종료 버튼을 누르면 메인 액티비티의 TextView로 값이 전달하게 만들 것이다.

 

이제 MainActivity.java로 가서 코드를 작성해 보자!

 

기본적으로 TextView와 Button의 객체를 만들어 주고 각각 id 값을 넣어줍니다.

 

그리고 REQUEST_CODE = 999 라는 상수를 선언합니다.

 

btn_go 버튼 클릭시 이벤트를 작성해 줍니다.

 

여기서 Intent를 사용하여 SubActivity로 전환하게 한다 startActivityForResult()메서드에는 인자가 2개 들어가게 되는데 

첫 번째 인자는 intent가 들어가고 두 번째 인자에는 위에 선언했던 RESULT_CODE 상수 값을 넣어 결과를 요청할 때 확인할 요청 코드를 보낸다.

 

 

다음 SubActivity.java에서 코드를 작성합니다,

 

메인 액티비티와 같이 기본적으로 EditText와 Button의 객체를 생성하고 각각 id값을 넣어줍니다.

 

 

 

 

btn_close버튼 클릭시 이벤트를 작성해 줍니다.

여기도 intent 객체를 생성해주고 intent.putExtra()메서드를 사용하여 값을 저장해 줍니다.

putExtra()메서드의 첫 번째 인자는 id값이며 두 번쨰 인자에 저장할 값을 넣어줍니다.

다음 setResult()에 결과값을 설정합니다. RESULT_OK는 안드로이드에서 기본적으로 제공하는 상수 값이다

finish()메서드는 현재 액티비티를 종료해주는 것이다

 

 

 

다음 메인 액티비티에서 onCreate생명주기 밖에서 결과를 받아오기 위해 ctrl + o 누른 다음에  onActivityResult()를 오버라이딩 해줍니다

 

 

onActivityResult()메서드는 3개의 인자가 넘어오고 있는 것을 확인할 수 있다.

첫 번째는 resquestCode, 두 번째는 resultCode, 세 번쨰 인자는 Intent 객체가 넘어온다

 

SubActivity에서 setResult메서드를 설정해 주었으므로 resultCode가 RESULT_OK 같으면 Toast 수신 성공 메시지를 만들어 주고 그렇지 않으면 수신 실패 메시지를 만들어 줍니다

 

그리고

메인 액티비티에서 btn_go 버튼을 눌러 REQUEST_CODE를 담아 보냈으며 다시 돌아올 떄도 requestCode에 맞게 돌아왔는지 검사합니다

requestCode가 REQUEST_CODE가 같으면 Intent 객체 data를 통해 값을 받아와서 우리가 원하던 tv_comback(TextView)에 값을 넣어줍니다.

 

 

이제 빌드를 해주면

 

 

값을 입력해 주고 종료 버튼을 누르면

 

 

 

값이 전달되는 것은 물론 수신 성공 토스트 메시지도 잘 확인할 수 있다!!