ภาพรวม
ตัวอย่างนี้สาธิตวิธีส่งภาพ (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 Parcelable | putExtra("key", bitmap) | ส่งรูปไดนามิกได้ | ขนาดใหญ่ อาจเกิน Binder limit (1MB) |
| Byte Array | putExtra("key", byte[]) | ควบคุมคุณภาพได้ | ต้อง encode/decode ใช้หน่วยความจำมาก |
| File Path / Uri | putExtra("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