[ Do it! ] 안드로이드 앱 프로그래밍 - #3. 어플리케이션 구성하기 (2)

ma.caron_g·2022년 3월 6일
0

Do it! - Android Studio

목록 보기
8/18
post-thumbnail

[ 화면 전환하기 ]

안드로이드는 일반적으로 하나의 화면을 하나의 액티비티라고 생각할 수 있습니다.
앱을 구성하는 각 화면은 액티비티로 구현되며 이러한 액티비티끼리 전환하는 과정은 각각의 액티비티를 필요에 따라 띄우거나 닫는 과정과 같습니다.

따라서 액티비티에 대해 확실히 이해하는 것은 좋은 앱을 만드는 기초가 됩니다.

[ Intent ]

Intent 객체명 = new Intent(현재 액티비티명, 이동할 액티비티명);

putExtra("key값", "value값") 메서드를 이용하여 값을 저장하여 보낼 수 있으며,

전달을 받는 액티비티에서 Intent 객체명 = getIntent() 를 통해 전달 받은 메서드를 받을 수 있습니다.

< 값이 String일 때 >
객체명.getExtras().getString("key") 매개변수에 키값을 넣어 전달 받은 값을 받을 수 있습니다.


[ startActivity() ]

startActivity()메서드에 인텐트 객체를 매개변수로 넣어 화면 전환을 할 수 있습니다.

액티비티가 전환되면서 현 액티비티에서 다른 액티비티로 값을 전달 받아 처리할 상황이 생기는데
이때 어떤 액티비티에서 온 값인지 확인하기 위해 아래와 같은 메서드를 사용한다.

[ startActivityForResult() ]

2020년 5월 이전에는 startActivityForResult를 이용하여 액티비티를 전환하며 결과를 받아왔지만 지금은 deprecated되었다.

startActivityForResult(Intent intent, int requestCode)

그 이유는 사용에 있어서 오류와 불편함이 발생해서인데 이유는 차차 알아보도록하자.

[ registerForActivityResult() ]

새로운 API가 도입되면서 registerForActivityResult()메서드를 사용한다.

사용방법은 아래와 같다.

Button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(getApplicationContext(), PartActivity.class);
        startActivity.launch(intent);
    }
});

ActivityResultLauncher startActivity = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
    @Override
    public void onActivityResult(ActivityResult result) {

    }
});

ActivityResultLauncher의 객체를 만들고, 그 객체를 원하는 곳에 launch(Intent intent)를 호출하면 된다.

[ 간단한 대화상자를 띄워보자 ]

xml파일을 하나 만들고 매니페스트에 접근해준다.

[ app/manifests/manifest.xml ]

내가 만든 액티비티가 추가되어 있는데 여기에 android:label="대화상자의 띄울 내용"값이랑 android:theme="@style/Theme.AppCompat.Dialog 코드를 추가해준다.
theme를 통해 해당 액티비티가 대화상자로 사용할 수 있게끔 해준다.

<activity
    android:name=".PartActivity"
    android:label="메뉴 액티비티"
    android:theme="@style/Theme.AppCompat.Dialog"
    android:exported="false" />
<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

[ activity_main.xml ]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnPopUp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="15dp"
        android:text="메뉴화면 띄우기"
        android:textSize="18sp"
        android:textStyle="bold" />

</LinearLayout>

[ activity_part.xml ]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_margin="10dp"
    tools:context=".PartActivity">

    <Button
        android:id="@+id/btnBack"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="돌아가기"
        android:textStyle="bold" />

</LinearLayout>

[ MainActivity.java ]

package com.study.doit;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    public static final int REQUEST_CODE_MENU = 101;

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

        Button btnPopUp = findViewById(R.id.btnPopUp);

        btnPopUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), PartActivity.class);
                startActivity.launch(intent);
            }
        });

    }

    ActivityResultLauncher startActivity = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            if(result.getResultCode() == Activity.RESULT_OK) {
                Toast.makeText(getApplicationContext(), "합격" , Toast.LENGTH_SHORT).show();
            }
            else {
                Toast.makeText(getApplicationContext(), "탈락", Toast.LENGTH_SHORT).show();
            }
        }
    });
}

[ PartActivity.java ]

package com.study.doit;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.LinearLayout;

public class PartActivity extends AppCompatActivity {

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

        Button btnBack = findViewById(R.id.btnBack);
        btnBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("name", "Ma");
                setResult(RESULT_OK, intent);

                finish();
            }
        });
    }
}

서브 액티비티가 종료되면 메인 액티비티에 onActivityResult
setResult()를 사용해서 resultCode를 보내 액티비티에서 어떠한 응답을 보냈는지 판별할 수 있습니다.
RESULT_OK를 통해 정상처리 됨을 알립니다.

응답을 받은 액티비티에서는 아래와 같은 코드로 응답에 따라 원하는 동작을 구현할 수 있습니다.

ActivityResultLauncher startActivity = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
    @Override
    public void onActivityResult(ActivityResult result) {
        if(resultCode != RESULT_OK) {
            return;
        }
        switch(requestCode) {
            case TEST_RESULT:
                // 동작 구현
            case TEST2_RESULT:
                // 동작 구현
    }
}

액티비티가 불러와지면 스택 구조로 액티비티가 쌓이고,
백키를 누르면 상위 스택이 삭제되고 그 아래에 있는 액티비티가 화면에 보여지게되는데 이때 스택에 쌓지않고 화면을 끝내기 위해 finish()코드를 이용한다.

[ 실행 화면 ]

profile
다른 사람이 만든 것을 소비하는 활동보다, 내가 생산적인 활동을 하는 시간이 더 많도록 생활화 하자.

0개의 댓글