Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Truyền Drawable giữa các Activity Android Kotlin

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ểmNhược điểm
Truyền Resource ID (Int)Nhẹ, nhanh, đơn giảnChỉ dùng được resource trong app
Truyền Bitmap qua ParcelableTruyề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ướcPhức tạp, cần permission
Shared ViewModel / RepositoryKiến trúc hiện đại, lifecycle-awareCầ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)