08 여러 화면 만들고 화면 간 전환하기
대부분의 앱은 여러 화면으로 구성되어 있고 화면을 전환하며 실행된다. 그리고 화면은 액티비티로 구현한다. 액티비티를 소스 코드에서 띄울 때는 startActivity 메서드 또는 startActivityForResult 메서드를 사용한다. startActivity 메서드는 액티비티에서 새 액티비티를 띄우기만 할 때 사용하고, startActivityForResult 메서드는 새 액티비티에서 원래의 액티비티로 돌아오면서 새 액티비티의 응답을 받아 처리해야 하는 경우에 사용한다.
app > 우클릭 > New > Activity > Empty Activity > Activity name 입력 > Finish
XML 파일과 소스 코드 파일이 두 개씩 만들어졌다. 하나의 XML 파일에는 메뉴 화면 띄우기 버튼을, 다른 하나의 XML 파일에는 돌아가기 버튼을 추가한다.
▼ 메뉴 화면 띄우기 버튼을 눌러 새 액티비티 띄우기
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE_MENU = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
startActivityForResult(intent, REQUEST_CODE_MENU);
}
});
}
}
인텐트 객체를 생성할 때 파라미터로 앱의 Context와 MenuActivity.class를 전달하고 있다. 아마 인텐트에서 사용할 클래스를 지정한 것 같다.
startActivityForResult 메서드의 파라미터로 인텐트와 요청 코드를 전달한다. 요청 코드의 값은 마음대로 지정해도 되며, 이 값으로 어떤 액티비티로부터 온 응답인지 구분한다. 새 액티비티로부터 응답을 받을 때 다시 전달받을 값이니 중복되지 않아야 한다.
▼ 돌아가기 버튼을 눌러 원래의 액티비티로 돌아가기
public class MenuActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
// 버튼 객체 참조
Button button = findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 인텐트 객체 생성하고 name의 값을 부가 데이터로 넣기
Intent intent = new Intent();
intent.putExtra("name","luvboo");
// 응답 보내기
setResult(RESULT_OK, intent);
// 현재 액티비티 없애기
finish();
}
});
}
}
인텐트 객체를 생성하고, putExtra 메서드로 인텐트에 데이터를 넣는다. 이 메서드를 이용할 때는 키(Key)와 데이터 값(Value)을 쌍으로 넣어야 한다.
setResult 메서드를 호출해 응답 코드와 데이터가 담긴 인텐트 객체를 전달한다. 응답 코드는 보통 RESULT_OK 상수를 전달하는 방법으로 정상 처리임을 알리는데, 내가 지정할 수도 있다.
finish 메서드는 액티비티를 화면에서 없애고 싶을 때 사용한다.
▼ 새 액티비티로부터 받은 응답 처리하기
public class MainActivity extends AppCompatActivity {
// 중략
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE_MENU){
Toast.makeText(getApplicationContext(),
"onActivityResult 메서드 호출됨. \n 요청 코드: " + requestCode +
", 결과코드: " + resultCode,
Toast.LENGTH_LONG).show();
if(resultCode == RESULT_OK){
String name = data.getStringExtra("name");
Toast.makeText(getApplicationContext(),
"응답으로 전달된 name: " + name,
Toast.LENGTH_LONG).show();
}
}
}
}
새 액티비티로부터 받은 응답을 처리하기 위해 MainActivity에서 onActivityResult 메서드를 재정의한다. 첫 번째 파라미터인 requestCode는 액티비티를 띄울 때 전달했던 요청 코드와 같다. 두 번째 파라미터인 resultCode는 새 액티비티로부터 전달된 응답 코드이다. 세 번째 파라미터인 data는 새 액티비티로부터 전달받은 인텐트이다.
putExtra 메서드로 넣은 데이터를 getStringExtra 메서드를 호출해 키값으로 가져온다.

'Android' 카테고리의 다른 글
[Do it! 안드로이드 앱 프로그래밍 #10] 태스크 관리, 액티비티 수명주기 이해하기 (0) | 2021.11.24 |
---|---|
[Do it! 안드로이드 앱 프로그래밍 #9] 인텐트, 플래그 그리고 부가 데이터 사용하기 (0) | 2021.11.21 |
[Do it! 안드로이드 앱 프로그래밍 #7] 레이아웃 인플레이션 이해하기 (0) | 2021.11.18 |
[Do it! 안드로이드 앱 프로그래밍 #6] 토스트, 스낵바, 대화상자 그리고 프로그레스바 사용하기 (0) | 2021.11.17 |
[Do it! 안드로이드 앱 프로그래밍 #5] 이벤트 처리 이해하기 (0) | 2021.11.16 |