군침이 싹 도는 코딩

액티비티 ( Activity ) 간의 양방향 데이터 전달법과 액티비티 백버튼 누를때 ( ActivityResultLauncher<Intent>, setResult ) 본문

Android

액티비티 ( Activity ) 간의 양방향 데이터 전달법과 액티비티 백버튼 누를때 ( ActivityResultLauncher<Intent>, setResult )

mugoori 2023. 1. 30. 16:06
public class MainActivity extends AppCompatActivity {

    Button button;
    EditText editName;
    EditText editAge;
    TextView txtAge;

    // 내가 실행한 액티비티로부터 데이터를 다시 받아오는 경우에 작성하는 코드
    ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            if (result.getResultCode() == 0){
                int age10 = result.getData().getIntExtra("age10",0);
                txtAge.setText(age10+"살");
            }
        }
    });

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

        Log.i("LifeCycleApp","onCreate 함수 실행");

        button = findViewById(R.id.button);
        editName = findViewById(R.id.editName);
        editAge = findViewById(R.id.editAge);
        txtAge = findViewById(R.id.txtAge);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String name = editName.getText().toString().trim();
                String strAge = editAge.getText().toString().trim();
                int age =Integer.parseInt(strAge);

                // 두번째 액티비티를 실행시키는 코드 작성

                // 인텐트를 만든다
                // 인텐트란 어떤 액태비티가 어떤 액티비티를 실행 시키겠다는 것
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                // 새로운 액티비티에 전달할 데이터를 셋팅한다
                // key, value 로 데이터 셋팅
                intent.putExtra("name", name);
                intent.putExtra("age", age);


                // 양방향 데이터 전달할때
                launcher.launch(intent);
            }
        });
    }

# MainActivity 코드

단방향 데이터 전달과 다르게 양방향 데이터 전달은 launcher라는 멤버변수를 만들어야한다

멤버변수 launcher를 만들고 startActivity가 아닌 launcher.launch(인텐트변수) 를 사용한다

 

 

    // 내가 실행한 액티비티로부터 데이터를 다시 받아오는 경우에 작성하는 코드
    ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            if (result.getResultCode() == 0){
                int age10 = result.getData().getIntExtra("age10",0);
                txtAge.setText(age10+"살");
            }
        }
    });

# 멤버변수 launcher 코드만 따로 분석해보자면 템플릿을 만들고

안에 조건문으로 result가 상태코드 0 인지를 체크해서 0이면 age10을 가져오고

그것을 txtAge에 출력하라는 뜻이다 result에는 SecondActivity에서 받아온 인텐트가 있다

 

 

public class SecondActivity extends AppCompatActivity {

    TextView txtName;
    TextView txtAge;
    int age;

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

        Log.i("LifeCycleApp","두번째 액티비티의 onCreate 함수 실행");

        txtName = findViewById(R.id.txtName);
        txtAge = findViewById(R.id.txtAge);

        // 이 액티비티를 실행한 액티비티로부터 데이터를 받아오는 코드
        // 인텐트를 가져오고 그 인텐트에 들어있는 키값으로 데이터를 받아온다
        String name = getIntent().getStringExtra("name");
        age = getIntent().getIntExtra("age", 0);

//        Intent intent = getIntent();
//        String name = intent.getStringExtra("name");

        txtName.setText(name);

        age = age + 10;
        txtAge.setText(age+"살");
    }

    // Back 버튼 눌렀을때의 이벤트 처리 방법
    @Override
    public void onBackPressed() {

        Log.i("LifecycleApp","두번째 액티비티의 onBackPressed 실행");

        // 10년후의 나이를 메인액티비티로 전달
        Intent intent = new Intent();
        intent.putExtra("age10",age);
        // 돌려줄때는 startActivity 가 아니라 setResult 함수 이용
        setResult(0,intent);

        super.onBackPressed();
    }

# SecondActivity 코드

백버튼을 눌렀을때 이벤트를 처리하는 방법은 onBackPressed 라는 함수를 사용한다

여기에 인텐트를 생성해주고 putExtra로 데이터를 세팅해준다음

setResult(상태코드,인텐트변수) 를 써준다

주의할점은 여기서 코드를 작성할때 super.onBackPressed(); 위에 작성을 해야한다

그렇지 않으면 앱을 그냥 종료해버려서 오류가 난다