Android Java

Truyền dữ liệu giữa hai Activity trong Android

Xây màn hình chọn học phần và màn hình chi tiết bằng Intent tường minh, có xử lý mã học phần thiếu hoặc sai.

Thực hànhCơ bản11 phút đọcJava

Thích và đánh giá Bình luận và hỏi đáp
Activity danh sách gửi mã học phần. Activity chi tiết đọc mã và tra thông tin để hiển thị.
Activity danh sách gửi mã học phần. Activity chi tiết đọc mã và tra thông tin để hiển thị. Mở hình lớn ↗

1. Chọn dữ liệu cần đi qua giữa hai màn hình

Màn hình đầu hiển thị hai học phần. Khi người dùng chọn một học phần, ứng dụng mở màn hình chi tiết và hiển thị tên tương ứng. Bản mẫu gửi mã học phần như CTDL01 thay vì gửi toàn bộ đối tượng. Màn hình nhận có thể tra mã trong bộ dữ liệu cục bộ hoặc trong kho dữ liệu khi ứng dụng lớn hơn.

Xác định giao kèo trước khi viết giao diện. Khóa của extra được khai báo một lần, giá trị truyền là chuỗi và màn hình chi tiết có thông báo rõ nếu không đọc được mã. Khi dùng tên khóa có tiền tố theo ứng dụng, lập trình viên dễ nhận diện extra và tránh vô tình dùng trùng khóa trong các luồng khác.

2. Tạo hai Activity bằng Java

Bài dùng Android Studio với một ứng dụng Java và tạo giao diện ngay trong mã để tập trung vào luồng dữ liệu. Đặt CourseFlow.java trong gói vn.utt.sotay. Hai Activity là lớp lồng public static, vì vậy tên trong manifest chứa ký tự $. Nếu dự án dùng gói khác, đổi khai báo package và tên khai báo trong manifest cho khớp.

Môi trường thực hành. Mẫu Java dùng trong dự án Android với AndroidX và các tài nguyên giao diện được mô tả trong bài. Tệp này chưa phải một ứng dụng Android hoàn chỉnh.

Java · CourseFlow.javaTải mã nguồn
package vn.utt.sotay;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public final class CourseFlow {
    private static final String EXTRA_COURSE_ID = "vn.utt.sotay.COURSE_ID";
    private static final String[][] COURSES = {
        {"CTDL01", "Cấu trúc dữ liệu và giải thuật"},
        {"KTPM01", "Kiểm thử phần mềm"}
    };

    private static LinearLayout column(Activity screen) {
        LinearLayout layout = new LinearLayout(screen);
        layout.setOrientation(LinearLayout.VERTICAL);
        int padding = Math.round(20 * screen.getResources().getDisplayMetrics().density);
        layout.setPadding(padding, padding, padding, padding);
        return layout;
    }

    public static class ListActivity extends Activity {
        @Override
        protected void onCreate(Bundle state) {
            super.onCreate(state);
            LinearLayout layout = column(this);
            TextView title = new TextView(this);
            title.setText("Chọn học phần");
            title.setTextSize(22);
            layout.addView(title);

            for (String[] course : COURSES) {
                Button button = new Button(this);
                button.setText(course[1]);
                button.setOnClickListener(view -> {
                    Intent intent = new Intent(this, DetailActivity.class);
                    intent.putExtra(EXTRA_COURSE_ID, course[0]);
                    startActivity(intent);
                });
                layout.addView(button);
            }
            setContentView(layout);
        }
    }

    public static class DetailActivity extends Activity {
        @Override
        protected void onCreate(Bundle state) {
            super.onCreate(state);
            String code = getIntent().getStringExtra(EXTRA_COURSE_ID);
            String name = "Không tìm thấy học phần";
            for (String[] course : COURSES) {
                if (course[0].equals(code)) {
                    name = course[1];
                    break;
                }
            }

            LinearLayout layout = column(this);
            TextView title = new TextView(this);
            title.setText(name);
            title.setTextSize(22);
            layout.addView(title);

            Button back = new Button(this);
            back.setText("Quay lại danh sách");
            back.setOnClickListener(view -> finish());
            layout.addView(back);
            setContentView(layout);
        }
    }
}

new Intent(this, DetailActivity.class) chọn đích tường minh. Sau khi thêm extra bằng putExtra, startActivity mở đích và hệ thống chuyển Intent cho Activity đó. Màn hình chi tiết gọi getIntent và đọc chuỗi bằng đúng khóa mà màn hình danh sách đã dùng.

3. Khai báo thành phần và chạy thử

Đặt hai khai báo sau bên trong <application> trong AndroidManifest.xml. Nếu project mẫu đã có Activity mặc định làm launcher, chuyển vai trò đó sang màn hình danh sách trước khi chạy.

<activity
    android:name="vn.utt.sotay.CourseFlow$DetailActivity"
    android:exported="false" />
<activity
    android:name="vn.utt.sotay.CourseFlow$ListActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Activity danh sách có bộ lọc MAIN và LAUNCHER để hệ thống hiển thị biểu tượng mở ứng dụng. Activity chi tiết phục vụ luồng bên trong ứng dụng. Nút quay lại gọi finish(), để Android quay về Activity danh sách đã có trong ngăn xếp.

4. Kiểm thử dữ liệu và vòng đời

  1. Mở từng học phần và đối chiếu tên trên màn hình chi tiết. Trường hợp chọn mục thứ hai giúp phát hiện lỗi luôn gửi mã của mục đầu.
  2. Tạm bỏ dòng putExtra. Màn hình chi tiết phải hiển thị “Không tìm thấy học phần”. Sau đó thử gửi một mã lạ để kiểm tra cùng thông báo với đầu vào khác.
  3. Xoay màn hình chi tiết trên thiết bị cho phép xoay. Bài mẫu đọc lại Intent trong onCreate, nên vẫn hiển thị học phần đã chọn khi Activity được tạo lại.

Để mở rộng, thay mảng bằng kho dữ liệu có hàm findById. Lúc đó mã học phần vẫn là giao kèo giữa hai màn hình, còn cách lấy tên và nội dung có thể thay đổi độc lập.

Đọc thêm tại Android Developers · Intents and intent filters.