JLOG

[안드로이드 스튜디오 강좌 #19] 여러 화면 만들고 화면 간 전환하기 본문

안드로이드 스튜디오/Do it 안드로이드 스튜디오

[안드로이드 스튜디오 강좌 #19] 여러 화면 만들고 화면 간 전환하기

정정선선 2020. 9. 17. 17:02

!목표

어플 내에서 여러 화면들을 만들어보고 각 화면을 전환해보자

 

 

대부분의 앱은 여러 화면으로 구성되어 있고, 화면을 전환하며 실행된다.

화면은 액티비티로 구현한다. 즉, 화면을 띄우거나 닫는 과정은 액티비티를 전환하는 것과 같다.

 

*참고

안드로이드 앱의 4가지 구성 요소

앱을 단말에 설치했을 때

-액티비티(Activity)

-서비스(Service)

-브로드캐스트 수신자(Broadcast Recivr)

-내용 제공자(Content Provider)

요소들에 대한 정보들을 요구한다.

 

 

 

AndroidManifest.xml 파일이 이러한 구성 요소들에 대한 정보들을 가지고 있다.

 

만약 새 액티비티를 사용하고 싶다면 새 액티비티 정보를 매니페스트 파일에 추가하여야 한다.

소스코드에서 단순히 액티비티를 띄우려면 startActivity() 메서드를 사용하면 된다.

 

하지만, 앱을 만들다 보면 메인 엑티비티에서 띄워야 할 화면이 많아져 띄웠던 화면을 닫고 원래의 메인 화면으로 돌아올 때 데이터를 새로 적용해야 하는 경우가 자주 생긴다.

즉, 어떤 액티비티를 띄운 것인지 띄웠던 액티비티로부터 다시 원래의 액티비티로 돌아오면서 응답을 받아 처리해야 한다.

이런 경우에는 startActivityForResult() 메서드를 사용하면 된다.

startActivityForResult(intent intent, int requestCode)

intent : 앱 구성요소(컴포넌트) 간에 작업 수행을 위한 정보를 전달하는 역할

requestCode : 각각의 액티비티를 구별하기 위해 사용

액티비티를 전환할 때 어떤 액티비티로부터 돌아온 응답인지 구별할 수 있어야 한다.

 

 

 

 

-실습

startActivityForResult() 메서드로 두 개의 액티비티 전환하기

 

새 프로젝트 SampleIntent를 만들자.

프로젝트 창에서 app-오른쪽클릭-New-Activity-Empty Activity 메뉴에서 새로운 액티비티를 추가하자.

Activity name에 MenuActivity를 입력해주고 Finish 버튼을 누르면 새 액티비티가 추가 된다.

 

app-manifests-AndroidManifest.xml 파일을 열어

MenuActivity에 label, theme 속성을 추가해주자.

<activity android:name=".MenuActivity"
            android:label="메뉴 액티비티"
            android:theme="@style/Theme.AppCompath.Dialog">
        </activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

android:label 속성 : 화면의 제목을 설정

android:theme 속성 : 테마를 설정할 때 사용, 코드에서는 대화상자 형태로 설정했다.

 

 

이제 activity_menu.xml에서 가운데에 버튼을 추가하고 text 속성에 '돌아가기'를 입력해주자

activity_menu.xml은 새 화면이기 때문에 돌아가기 버튼을 누르면 원래 메인 액티비티로 돌아가도록 설정할 것이다.

 

 

MenuActivity.java를 열어 아래 코드를 입력해주자

package org.techtowm.sampleintent;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MenuActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("name", "mike");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

button을 클릭했을 때 호출되는 onClick() 메서드에서 Intent 클래스를 사용해 객체를 만들어 name의 값을 부가 데이터로 넣어준 후,

setResult() 메서드를 호출해 응답을 보냈다.

setResult(응답코드, 인텐트) 메서드는 새로 띄운 액티비티에서 이전 액티비티로 인텐트를 전달하고 싶을 때 사용한다.

finish()를 이용해 현재 액티비티를 없애주었다.

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("name", "mike");
                setResult(RESULT_OK, intent);
                finish();
            }

 

 

이제 activity-main.xml 파일을 열어 텍스트뷰를 삭제하고 가운데에 버튼을 추가하자.

text 속성은 '메뉴 화면 띄우기'로 button id는 button2으로 설정하자

 

 

MainActivity.java를 열어 아래 코드를 입력해주자.

package org.techtowm.sampleintent;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

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 button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
                startActivityForResult(intent, REQUEST_CODE_MENU);
            }
        });
    }
}

button2의 onClick 메소드를 설정할 때 인텐트 객체를 생성했다.

            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
                startActivityForResult(intent, REQUEST_CODE_MENU);
            }

인텐트 객체는 액티비티를 띄울 목적으로 사용되고 액티비티 간에 데이터를 전달하는 데에도 사용할 수 있다.

 

 

intent의 첫번째 파라미터로는 context 객체가 전달되는데 일반적으로 this를 변수를 사용하지만, 여기서는 this 변수로 MainActivity 객체를 참조할 수 없음으로 getApplicationContext() 메서드를 사용해 Context 객체를 참조한 후 전달한다.

두번째 파라미터로는 메뉴 액티비티의 클래스 인스턴스인 MenuActivity.class를 전달한다.

 

새 액티비티를 띄울 때 startActivityForResult() 메서드를 호출했다.

startActivityForResult()는 startActivity() 메서드처럼 새 액티비티를 띄우지만, 새 액티비티로부터 응답을 받을 수도 있다.

REQUEST_CODE_MENU는 새 액티비티를 띄울 때 보낼 요청 코드이다. 코드 값은 중복 되지 않는 선에서 마음대로 지정해도 된다. 어떤 액티비티에서 응답을 보냈고 받았는지 확인할 수 있다.

코드의 값은 마음대로 지정할 수 있다.

 

 

띄울 때 요청코드로 액티비티를 띄우고, 응답할 때 요청코드와 응답코드를 전송해 어떤 액티비티로 온 응답인지 구별할 수 있다.

 

 

이제 새로 띄운 MenuActivity로 부터 받은 응답을 처리하는 메서드를 추가한다.

MainActivity 클래스 안에서 오른쪽 버튼-Generate-Override Methods 메뉴 누르거나 Ctrl + O를 눌러 onActivityResult 메서드를 찾아 Ok를 눌러 추가해준다.

 

그후 아래 코드처럼 MainActivity.java를 작성해준다.

@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 메서드 호출됨. 요철 코드 : " + requestCode +
                    ", 결과 코드 : " + resultCode, Toast.LENGTH_LONG).show();

            if (resultCode == RESULT_OK){
                String name = data.getStringExtra("name");
                Toast.makeText(getApplicationContext(), "응답으로 전달된 name : " + name,
                        Toast.LENGTH_LONG).show();
            }
        }
    }

onActivityResult() 메서드는 새로 띄웠던 메뉴 액티비티가 응답을 보내오면 그 응답을 처리하는 역할을 한다.

 

 

-onActivityResult() 메서드

protexted void onActivityResult(int requestCode, int resultCode, intent intent)

첫 번째 파라미터(requestCode) : 액티비티를 띄울 때 전달한 요청 코드

     이 값으로 어떤 액티비티로부터 응답을 받은 것인지 구분할 수 있다.

 

두 번째 파라미터(resultCode) : 새 액티비티로부터 전달 된 응답 코드

    응답 코드는 새 액티비티에서 처리한 결과가 정상인지 아닌지 구분하는데 사용된다.

    보통 Activity.RESULT_OK 상수를 전달하는 방법으로 정상 처리임을 알린다. 임의로도 코드를 설정할 수도 있다.

 

세 번째 파라미터(intent) : 새 액티비티로부터 전달 받은 인텐트

     이 인텐트 안에 새 액티비티의 데이터를 전달할 수 있다. 인텐트 객체는 주로 새 액티비티롭터 원래의 액티비티로

     데이터를 전달할 때 사용한다.

 

putExtra() 메서드를 사용해 간단히 인텐트 객체에 데이터를 넣을 수 있다. 이 메서드를 이용할 때 키(key)와 데이터 값(Value)을 쌍으로 넣어야한다. 이 값을 다시 확인하는 경우에는 키(Key)를 사용해 데이터 값을 가져올 수 있다.

 

 

 

-실행

이제 어플을 실행시켜 보자

버튼을 누르면 메뉴 화면이 뜨고, 그 화면의 버튼을 누르면 다시 메인 액티비티로 돌아간다. 다시 메인 액티비티로 돌아갈 때 응답 상태를 토스트 메세지로 보여준다.

 

 

 

지금까지 새로운 액티비티를 만들어 추가하고 서로 간에 상태 코드나 데이터를 주고 받는 방법에 대해 알아보았다.

 

과정을 정리하면,

 1) 새로운 액티비티 만들기

    새로운 액티비티를 추가하면 XML 레이아웃 파일 하나와 자바 소스 파일 하나가 만들어지고 매니페스트 파일에

    액티비티 태그가 추가된다.

 2)새로운 액티비티의 XML 레이아웃 정의하기

   새로 만들어진 XML 레이아웃을 수정하여 새로운 액티비티의 화면이 어떻게 배치될지를 작성한다.

 3)메인 액티비티에서 새로운 액티비티 띄우기

    메인 액티비티의 버튼을 클릭하면 startActivityForResult() 메서드로 새로운 액티비티를 띄운다.

  4)새로운 액티비티에서 응답 보내기

    새로운 액티비티가 보이고 그 안에 들어 있는 버튼을 클릭하면 setResult() 메서드로 응답을 보냅니다.

  5)응답 처리하기

    메인 액티비티에서 onActivityResult() 메서드를 재정의하여 새로 띄웠던 액티비티에서 보내오는 응답을 처리합니다.

 

     이 과정은 새로운 액티비티를 추가하기 위해 필요한 것이므로 실제 앱을 만들 때도 잘 이해하고 있어야 한다.

 

 


 

 

## 이 글은 Do it 안드로이드 앱 프로그래밍을 참고해서 작성되었습니다.

도서에는 더 자세하고 알기 쉽게 설명이 되어 있어 도서를 참고하면서 공부하는 것을 추천드립니다.

도서 정보 : http://www.yes24.com/Product/Goods/15789466

 

Do it! 안드로이드 앱 프로그래밍

안드로이드 분야 1위 도서, 개정 2판으로 돌아오다! (롤리팝, 안드로이드 스튜디오)안드로이드 분야에서 큰 사랑을 받아온 [Do it! 안드로이드 앱 프로그래밍]의 두 번째 전면 개정판이 나왔다. 최신 롤리팝 버전을 적용한 이번 개정 2판은 지난 젤리빈 개정판보다 더 개정폭이 커졌다. 특히 2014년 12월 발표된 안드로이드 공식 개발 도구인 ‘안드...

www.yes24.com

유투브 강의 : https://www.youtube.com/watch?v=nN4xnEcnjE8

 

Comments