목표

구현할 화면 : 로그인 화면, 메인메뉴 화면

동작 :

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까지 해줘야 함.

 

onclick 으로 textview, button 의 text 가져오기 (+ view를 사용해서)

2번 방법은 일반적으로 textview나 button의 text를 가져오는 방법이 아닙니다. 이방법은 필자가 반복된 작업에 있어 한번에 진행 하려고 생각하게된 조금다른 방법이다. 1. 일반적인 방법 일반적으로

dotiromoook.tistory.com

 

 

key 값을 "text"로 설정해서 값 text를 넣어주었다.

intent.putExtra("text", text); // 버튼의 값 넣기

 

헷갈렸던 것

MainActivity에서 MenuActivity로 갔다가 돌아오는 것이기 때문에 거기만 startActivity 또는 startActivityForResult를 넣어주면 된다.

근데 나는 화면 전환에 startActivity가 필요한 줄 알고 MenuActivity에도 startActivity를 넣어줌.

그리고 startActivity(intent, REQUEST_CODE)

여기서 REQUST_CODE는 말 그대로 액티비티 실행 후 저기로 돌아가기 위한 값임. (티켓 같은거)

근데 전달하는 값으로 착각해서 이상한 값 넣음. -> 그래서 ActivityNotFoundException 에러 뜸.

 

 

[안드로이드 Activity] startActivityForResult 사용법 및 startActivity와 차이점

Android 개발 Tip. - Activity Start Method 액티비티 실행시 값 전달 방법 startActivityForResult VS StartActivity 일반적으로 Activity를 띄울 때는 startActivity()를 사용한다. 다른 방법으로는 startActivityForResult()도 있

jhshjs.tistory.com

 

 

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) // 응답 보내기