목표
구현할 화면 : 로그인 화면, 메인메뉴 화면
동작 :
1. 로그인 화면 - 버튼을 누르면 메인메뉴 화면으로 넘어간다.
2. 메인메뉴 화면 - 세 개의 버튼이 존재한다. 각각의 버튼을 누르면 다시 로그인 화면으로 돌아가서, 눌렀던 버튼의 이름을 토스트로 띄운다.
과정
1. 액티비티를 하나 추가한다. MainActivity(로그인 화면), MenuActivity(메인메뉴 화면)
아래와 같이 XML을 구성한다.
2. MainActivity.java
package com.example.doitmission_07;
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE = 100;
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE){
if(resultCode!= RESULT_OK){ // 성공 값이 아니라면 return
return;
}
String text = data.getExtras().getString("text");
System.out.println(text); // 확인용
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show();
}
}
@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 view) {
Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
startActivityForResult(intent, REQUEST_CODE);
//finish();
}
});
}
}
2 - (1) 일단 REQUEST_CODE를 100으로 설정해주었다.
public static final int REQUEST_CODE = 100;
(왜 public static final이라는 멋진 칭호를 저녀석에게 주는지는 모르겠다.)
2- (2) Ctrl + o로 onActivityResult 메서드를 재정의해준다.
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE){
if(resultCode!= RESULT_OK){ // 성공 값이 아니라면 return
return;
}
String text = data.getExtras().getString("text");
System.out.println(text); // 확인용
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show();
}
}
인텐트에서 data 값을 뽑아온다. "text"라는 키값을 사용하여 해당 String 값을 뽑아온다.
Toast.makeText에 뽑아온 text를 넣어준다.
2 - (3) onClick 메서드를 보자.
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
startActivityForResult(intent, REQUEST_CODE);
//finish();
}
값을 받아올 것이기 때문에 StartActivityForResult를 사용한다.
여기서 내가 finish()를 넣어버리는 바람에 로그인화면으로 돌아옴과 동시에 앱이 종료되었다. (이런 실수를..)
3. MenuActivity.java
package com.example.doitmission_07;
public class MenuActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
Button button1 = findViewById(R.id.button1);
Button button2 = findViewById(R.id.button2);
Button button3 = findViewById(R.id.button3);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
String text = button1.getText().toString();
intent.putExtra("text", text); // 버튼의 값 넣기
setResult(RESULT_OK,intent); // 응답 보내기
finish();
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
String text = button2.getText().toString();
intent.putExtra("text", text);
setResult(RESULT_OK, intent);
finish();
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
String text = button3.getText().toString();
intent.putExtra("text", text);
setResult(RESULT_OK, intent);
finish();
}
});
}
}
button 1,2,3에 각각 코드를 작성해주었다. 내용은 같다. button1의 onClick 코드를 보자.
public void onClick(View view) {
Intent intent = new Intent();
String text = button1.getText().toString();
intent.putExtra("text", text); // 버튼의 값 넣기
setResult(RESULT_OK,intent); // 응답 보내기
finish();
}
버튼의 text 값을 뽑아내기 위해 button1.getText().toString() 을 작성했다.
getText() 하면 알아서 String 형으로 반환되는 줄 알았는데 아니었다. toString까지 해줘야 함.
key 값을 "text"로 설정해서 값 text를 넣어주었다.
intent.putExtra("text", text); // 버튼의 값 넣기
헷갈렸던 것
MainActivity에서 MenuActivity로 갔다가 돌아오는 것이기 때문에 거기만 startActivity 또는 startActivityForResult를 넣어주면 된다.
근데 나는 화면 전환에 startActivity가 필요한 줄 알고 MenuActivity에도 startActivity를 넣어줌.
그리고 startActivity(intent, REQUEST_CODE)
여기서 REQUST_CODE는 말 그대로 액티비티 실행 후 저기로 돌아가기 위한 값임. (티켓 같은거)
근데 전달하는 값으로 착각해서 이상한 값 넣음. -> 그래서 ActivityNotFoundException 에러 뜸.
4. 실행 결과
로그인 -> 매출 관리 버튼을 순서대로 눌렀을 때의 결과이다.
위와 같이 해당 버튼의 텍스트가 토스트로 나오는 것을 확인할 수 있다. 다른 버튼도 마찬가지로 실행되었다.
6. 느낀 점
아래 코드들을 잘 기억하자.
if(requestCode==REQUEST_CODE){}
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show()
startActivityForResult(intent, REQUEST_CODE)
intent.putExtras("key", value) // 값 넣기
data.getExtras().getString("key"); // 값 가져오기
setResult(RESULT_OK, intent) // 응답 보내기
'TIL > 안드로이드 스튜디오' 카테고리의 다른 글
패키지명 변경하기 (0) | 2024.12.16 |
---|---|
도전!8 - 세 개 이상의 화면 만들어 전환하기 (0) | 2024.12.13 |
4장 태스크 관리, 생명주기 (0) | 2024.12.07 |
4장 플래그와 부가 데이터 (0) | 2024.12.05 |
4장 인텐트 (0) | 2024.12.03 |