Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드에서 액티비티 간 드로어블(Drawable) 전달하는 방법 완벽 가이드

안드로이드 앱을 개발하다 보면 한 액티비티(Activity)에서 다른 액티비티로 이미지나 드로어블(Drawable)을 전달해야 하는 경우가 자주 발생합니다. 이번 튜토리얼에서는 Intent의 Extra에 드로어블 리소스 ID를 담아 전달하는 가장 간단하고 효율적인 방법을 단계별로 알아보겠습니다.

핵심 개념: 리소스 ID를 활용한 데이터 전달

Bitmap 객체 자체를 Intent로 직접 전달하면 용량 제한(TransactionTooLargeException) 문제가 발생할 수 있지만, 드로어블의 리소스 ID(int 타입)를 전달하면 매우 가볍고 안전합니다. 수신 측 액티비티에서는 전달받은 ID를 이용해 setImageResource() 메서드로 이미지를 설정하면 됩니다.

Step 1 — 새 프로젝트 생성

Android Studio를 실행하고 File ⇒ New Project로 이동한 뒤, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.

Step 2 — 메인 레이아웃 작성 (activity_main.xml)

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다. 화면 중앙에 버튼 하나를 배치하여 두 번째 액티비티로 이미지를 전송하는 역할을 합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/button"
        android:text="Transfer Bitmap to 2nd Activity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />
</RelativeLayout>

Step 3 — MainActivity 구현

src/MainActivity.java에 다음 코드를 작성합니다. 버튼 클릭 시 Intent 객체를 생성하고, putExtra() 메서드를 통해 드로어블 리소스 ID(R.drawable.ic_directions_walk)를 "picture"라는 키와 함께 전달합니다.

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
    Button button;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("picture", R.drawable.ic_directions_walk);
                startActivity(intent);
            }
        });
    }
}

Step 4 — SecondActivity 생성 및 구현

새로운 액티비티(SecondActivity.java)를 만들고 아래 코드를 작성합니다. getIntent().getExtras()로 Bundle을 가져온 후, "picture" 키로 저장된 int 값을 읽어 ImageView에 적용합니다. Bundle이 null인 경우를 체크하는 것이 안정성 면에서 중요합니다.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
public class SecondActivity extends AppCompatActivity {
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        imageView = findViewById(R.id.imageView);
        Bundle bundle = getIntent().getExtras();
        if (bundle != null){
            int picture = bundle.getInt("picture");
            imageView.setImageResource(picture);
        }
    }
}

Step 5 — 두 번째 레이아웃 작성 (activity_second.xml)

activity_second.xml 파일에 아래 코드를 추가합니다. 상단에는 타이틀 텍스트를, 중앙에는 전달받은 이미지를 표시할 ImageView를 배치했습니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Second Activity"
        android:layout_marginTop="25sp"
        android:layout_centerHorizontal="true"
        android:textSize="16sp"
        android:textStyle="bold"/>
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>
</RelativeLayout>

Step 6 — AndroidManifest.xml 등록

androidManifest.xml에 SecondActivity를 반드시 등록해야 합니다. 액티비티를 선언하지 않으면 실행 시 ActivityNotFoundException 오류가 발생하니 주의하세요.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SecondActivity"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기를 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run(실행) 아이콘을 클릭하고, 목록에서 본인의 모바일 기기를 선택하세요. 앱이 실행되면 기본 화면이 표시됩니다.

안드로이드에서 액티비티 간 드로어블(Drawable) 전달하는 방법 완벽 가이드

버튼을 누르면 두 번째 액티비티로 전환되면서, MainActivity에서 전달한 드로어블 이미지가 화면 중앙에 정상적으로 출력되는 것을 확인할 수 있습니다.

안드로이드에서 액티비티 간 드로어블(Drawable) 전달하는 방법 완벽 가이드

마무리 정리

이처럼 드로어블을 액티비티 간에 전달할 때는 Bitmap을 직접 넘기는 대신 리소스 ID를 putExtra()로 전달하는 방식이 권장됩니다. 코드가 간결할 뿐만 아니라 메모리 사용량도 적고, Binder 트랜잭션 크기 제한(약 1MB)으로 인한 크래시 위험도 없습니다. 만약 동적으로 생성된 Bitmap을 전달해야 한다면, 싱글톤 캐시나 파일 저장 후 경로를 전달하는 방식을 고려해 보세요.