군침이 싹 도는 코딩
액티비티 ( Activity ) 간의 양방향 데이터 전달법과 액티비티 백버튼 누를때 ( ActivityResultLauncher<Intent>, setResult ) 본문
Android
액티비티 ( Activity ) 간의 양방향 데이터 전달법과 액티비티 백버튼 누를때 ( ActivityResultLauncher<Intent>, setResult )
mugoori 2023. 1. 30. 16:06public 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(); 위에 작성을 해야한다
그렇지 않으면 앱을 그냥 종료해버려서 오류가 난다
'Android' 카테고리의 다른 글
이메일 형식 체크하기 ( pattern ) (0) | 2023.01.31 |
---|---|
SharedPreference 저장하기 불러오기 ( putString, getString ) (0) | 2023.01.31 |
액티비티 ( Activity ) 간의 단방향 데이터 전달법 ( putExtra, getIntent ) (0) | 2023.01.30 |
액티비티( Activity )간의 화면 전환 방법 ( Intent ) (1) | 2023.01.30 |
액티비티 라이프 사이클 ( Activity Life cycle ) 의 주요 4개 함수 ( onCreate, onResume, onPause, onDestroy ) (0) | 2023.01.30 |