Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีส่ง Drawable ระหว่าง Activity ใน Android

ภาพรวม

ตัวอย่างนี้สาธิตวิธีส่งภาพ (Drawable Resource) จาก Activity หนึ่งไปอีก Activity ผ่าน Intent โดยส่ง Resource ID (int) แทนการส่ง Bitmap โดยตรง

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

สร้างโปรเจกต์ Android ใหม่ใน Android Studio

ขั้นตอนที่ 2: Layout Activity หลัก (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="ส่งรูปภาพไป Activity ที่ 2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />
</RelativeLayout>

ขั้นตอนที่ 3: MainActivity.java

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);
                // ส่ง Resource ID (int) ไม่ใช่ Bitmap object
                intent.putExtra("picture", R.drawable.ic_directions_walk);
                startActivity(intent);
            }
        });
    }
}

ขั้นตอนที่ 4: SecondActivity.java

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 pictureResId = bundle.getInt("picture");
            imageView.setImageResource(pictureResId);
        }
    }
}

ขั้นตอนที่ 5: Layout Activity ที่ 2 (activity_second.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=".SecondActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activity ที่ 2"
        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>

ขั้นตอนที่ 6: AndroidManifest.xml

<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>

วิธีการส่งภาพ: เปรียบเทียบ

วิธีวิธีทำข้อดีข้อเสีย
Resource ID (ตัวอย่างนี้)putExtra("key", R.drawable.img)เล็ก เร็ว ไม่มีปัญหา Parcelableต้องมีรูปในทั้ง 2 แอป (same package)
Bitmap ParcelableputExtra("key", bitmap)ส่งรูปไดนามิกได้ขนาดใหญ่ อาจเกิน Binder limit (1MB)
Byte ArrayputExtra("key", byte[])ควบคุมคุณภาพได้ต้อง encode/decode ใช้หน่วยความจำมาก
File Path / UriputExtra("key", filePath)รองรับไฟล์ใหญ่ต้องจัดการ FileProvider
Glide/Picassoโหลดจาก URL โดยตรงไม่ต้องส่งระหว่าง Activityต้องมีอินเทอร์เน็ต

ส่ง Bitmap (กรณีต้องการ)

// ส่ง
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
intent.putExtra("bitmap", byteArray);

// รับ
byte[] byteArray = getIntent().getByteArrayExtra("bitmap");
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

การทดสอบ

รันแอป กดปุ่ม จะเปิด Activity 2 แสดงไอคอน ic_directions_walk