Hướng dẫn này minh họa cách truyền Drawable (hình ảnh) giữa các Activity trong Android sử dụng Kotlin.
Bước 1: Tạo dự án mới
Mở Android Studio, chọn File → New Project và điền thông tin cần thiết.
Bước 2: Thiết kế giao diện MainActivity (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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="Tutorials Point"
android:textAlignment="center"
android:textColor="@android:color/holo_green_dark"
android:textSize="32sp"
android:textStyle="bold" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Transfer Bitmap to 2nd Activity" />
</RelativeLayout>
Bước 3: Viết code MainActivity.kt
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
val button: Button = findViewById(R.id.button)
button.setOnClickListener {
val intent = Intent(this@MainActivity, NewActivity::class.java)
intent.putExtra("picture", R.drawable.ic_baseline_directions_walk_24)
startActivity(intent)
}
}
}
Bước 4: Tạo Activity thứ hai (NewActivity.kt)
import android.os.Bundle
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
class NewActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_new)
title = "KotlinApp"
val imageView: ImageView = findViewById(R.id.imageView)
val bundle = intent.extras
if (bundle != null) {
val pictureResId = bundle.getInt("picture")
imageView.setImageResource(pictureResId)
}
}
}
Layout cho NewActivity (activity_new.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=".NewActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="25sp"
android:text="Second Activity"
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>
Bước 5: Khai báo Activity trong AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.q11">
<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=".MainActivity">
<intent-filter>
</intent-filter>
</activity>
<activity android:name=".NewActivity" />
</application>
</manifest>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. Nhấn button "Transfer Bitmap to 2nd Activity" → Chuyển sang NewActivity hiển thị icon ic_baseline_directions_walk_24.
Các cách truyền Drawable/Bitmap
| Cách | Ưu điểm | Nhược điểm |
|---|---|---|
| Truyền Resource ID (Int) | Nhẹ, nhanh, đơn giản | Chỉ dùng được resource trong app |
| Truyền Bitmap qua Parcelable | Truyền bitmap thực tế | Giới hạn 1MB (Binder limit), chậm |
| Truyền Uri (Content Provider/File) | Không giới hạn kích thước | Phức tạp, cần permission |
| Shared ViewModel / Repository | Kiến trúc hiện đại, lifecycle-aware | Cần setup architecture |
Truyền Bitmap thực tế (Parcelable)
// Gửi
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.large_image)
intent.putExtra("bitmap", bitmap) // Bitmap implements Parcelable
// Nhận
val bitmap = intent.getParcelableExtra("bitmap")
imageView.setImageBitmap(bitmap)
Truyền Uri (Khuyên dùng cho ảnh lớn)
// Gửi - dùng FileProvider
val uri = FileProvider.getUriForFile(this, "${packageName}.provider", imageFile)
intent.putExtra("image_uri", uri)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
// Nhận
val uri = intent.getParcelableExtra("image_uri")
imageView.setImageURI(uri)