[Do it! 안드로이드 앱 프로그래밍 #8] 여러 화면 만들고 화면 간 전환하기
Android

[Do it! 안드로이드 앱 프로그래밍 #8] 여러 화면 만들고 화면 간 전환하기

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 메서드를 호출해 키값으로 가져온다.

 

새 액티비티로부터 전달받은 데이터
새 액티비티로부터 전달받은 데이터