안드로이드 스튜디오 :: Java :: Activity(화면) 값 전달받기

Android/Java 2020.06.25 댓글 moonsu
728x90

안드로이드 스튜디오:: Java :: Activity(화면) 값 전달하기 바로가기

이전 글을 토대로 작성된 글이기 때문에 "Activity간 값 전달하기" 글을 먼저 보길 권장한다.

안드로이드 스튜디오에서 Activity간의 데이터(값)를 받는 방법을 알아보자

 

 

1. LOGIN_CODE와 startActivityForResult() 추가

MainActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

	private static final int LOGIN_CODE = 101; //값이 어느 액티비티에서 오는지 구별한다.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText id = findViewById(R.id.id);
        final EditText number = findViewById(R.id.number);
        final Button button1 = findViewById(R.id.button1);

	//값 전달을 위한 버튼
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(v.getContext(), SubActivity.class);

                intent.putExtra("id", id.getText().toString()); //id 전달
                intent.putExtra("number", number.getText()); //회원번호 전달

                startActivityForResult(intent, LOGIN_CODE); //값을 전달받기 위해 startActivityForResult 함수를 사용한다.
            }
        });
    }
}

(1) LOGIN_CODE

생성할 수 있는 액티비티가 두 개 이상이라면 받아올 값이 어느 액티비티 출신인지 어떻게 구별할 수 있을까? 이 때 출신지를 구별하기 위해 사용하는 것이 LOGIN_CODE와 같은 상수이다. 새로운 액티비티를 띄울 때도(startActivityForResult), 값을 받아올 때도(onActivityResult) 이 코드로 출신지를 파악해야 용도에 맞게 데이터를 사용할 수 있다.

 

(2) startActivityForResult

말 그대로 결과(값)을 위한 액티비티를 시작하겠다는 뜻이다. 데이터와 상관이 없거나 주기만 할 때는 startActivity()를 사용한다.

 

 

2. SubActivity에서 값을 전달하는 액션을 주기 위해 버튼을 만든다.

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">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/data"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/data"
            android:text="회원 확인" />

    </RelativeLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

[android:layout_below="@+id/data"] 는 현재 뷰를 data라는 이름을 가진 뷰 바로 아래에 위치시키겠다는 의미

이렇게 만들어진다.

 

3. 메인 액티비티에 전달한 값을 입력한다.

SubActivity.java

public class SubActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);

        TextView data = findViewById(R.id.data);
        Button checkButton = findViewById(R.id.checkButton);

        //메인으로부터 값을 전달받는 구간**********
        Intent intent = getIntent();

        String id = intent.getStringExtra("id");
        int number = Integer.valueOf(intent.getStringExtra("number"));

        data.setText("id는 " + id + ", 회원번호는 " + number);
        //*********************************

        //버튼을 클릭하면
        checkButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //메인에 전달할 값을 저장한다.
                Intent intent = new Intent();
                intent.putExtra("result", "Login Success");

                //저장한 값과 함께 성공했다는 메세지(RESULT_OK)를 메인에 전달한다.
                setResult(RESULT_OK, intent);
                //서브액티비티 종료
                finish();
            }
        });
    }
}

 

(1) Intent - intent.putExtra(key, value)

새로운 인텐트(intent)를 생성해 메인에 전달할 값을 입력한다. MAP의 형태로써 키(key) 입력을 통해 값(value)을 가져온다. 여기선 result라는 키에 Login Success라는 값을 넣었다.

 

(2) setResult(RESULT_OK, intent)

setResult()로 결과를 저장할 수 있다. 이 때 성공인 경우 RESULT_OK실패한 경우 RESULT_CANCEL로 설정할 수 있다. 그 외에도 RESULT_FIRST_USER가 있으며 이 값은 모두 Activity의 멤버 상수로써 다음과 같은 의미를 갖는다.

RESULT_OK 작업이 성공일 때 사용하는 코드
RESULT_CANCELED 작업이 실패일 때 사용하는 코드
RESULT_FIRST_USER 사용자 정의 코드 
ex) public static final int LOGIN_CODE = Activity.RESULT_FIRST_USER + 1

 

 

4. 저장된 값을 호출하는 콜백함수 onActivityResult()

(1) MainActivity.java

public class MainActivity extends AppCompatActivity {

	private static final int LOGIN_CODE = 101; //값이 어느 액티비티에서 오는지 구별한다.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText id = findViewById(R.id.id);
        final EditText number = findViewById(R.id.number);
        final Button button1 = findViewById(R.id.button1);

	//값 전달을 위한 버튼
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(v.getContext(), SubActivity.class);

                intent.putExtra("id", id.getText().toString()); //id 전달
                intent.putExtra("number", number.getText()); //회원번호 전달

                startActivityForResult(intent, LOGIN_CODE); //값을 전달받기 위해 startActivityForResult 함수를 사용한다.
            }
        });
    }
    
    //두번째 액티비티가 종료될 때 불려지는 콜백함수
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode){
            case LOGIN_CODE:
                if(resultCode == RESULT_OK)
                    Toast.makeText(this, "Result: " + data.getStringExtra("result"), Toast.LENGTH_LONG).show();
                else //RESULT_CANCEL
                    Toast.makeText(this, "fail", Toast.LENGTH_LONG).show();
                break;
                
            default:
                break;
        }
    }
    
}

(1) onActivityResult()

startActivityForResult()로 액티비티를 호출했다면 해당 액티비티가 종료될 때(전달된 값이 없더라도) 호출되는 콜백함수다. 매개변수를 살펴보자.

    - requestCode

    앞서 말했던 출신지 코드, 미리 선언했던 상수인 LOGIN_CODE와 같은 것들을 의미한다. switch~case문을 이용해 액티비티를 구별했다.

    - resultCode

    Activity의 멤버 상수, RESULT_OK(성공)일 때 저장된 메시지가 호출되도록 코딩했다.

    - data

    두 번째 액티비티에서 저장한 값 데이터. 앞서 문자열을 저장했기 때문에 타입에 맞는 메소드인 getStringExtra()를 호출한다. 매개변수로는 키(key) 입력.

 

잘 호출된다.

 

 

액티비티에서 액티비티로 값을 주고받는 방법을 알아봤다.

 

Kotlin편 바로가기

안드로이드 스튜디오:: Java :: Activity(화면) 전환하기 바로가기

안드로이드 스튜디오:: Java :: Activity(화면) 값 전달하기 바로가기

728x90
반응형

댓글