Tải khung hiển thị theo yêu cầu

Đôi khi, bố cục của bạn yêu cầu các thành phần hiển thị phức tạp ít khi được dùng. Cho dù đó là thông tin chi tiết về mục, chỉ báo tiến trình hay thông báo huỷ, bạn đều có thể giảm mức sử dụng bộ nhớ và tăng tốc độ kết xuất bằng cách chỉ tải các khung hiển thị khi cần thiết.

Bạn có thể trì hoãn việc tải tài nguyên khi có các khung hiển thị phức tạp mà ứng dụng cần trong tương lai bằng cách xác định ViewStub cho các khung hiển thị phức tạp và hiếm khi được sử dụng.

Định nghĩa ViewStub

ViewStub là một khung hiển thị gọn nhẹ không có kích thước không vẽ bất cứ thứ gì hoặc tham gia vào bố cục. Do đó, cần ít tài nguyên để tăng cường và để lại trong hệ phân cấp khung hiển thị. Mỗi ViewStub bao gồm thuộc tính android:layout để chỉ định bố cục cần tăng cường.

Giả sử bạn có một bố cục mà bạn muốn tải sau này trong hành trình của người dùng trên ứng dụng:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:src="@drawable/logo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

Bạn có thể trì hoãn việc tải bằng cách sử dụng ViewStub sau. Để làm cho nó hiển thị hoặc tải bất kỳ nội dung nào, bạn phải làm cho nó hiển thị bố cục đã đề cập:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ViewStub
    android:id="@+id/stub_import"
    android:inflatedId="@+id/panel_import"
    android:layout="@layout/heavy_layout_we_want_to_postpone"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom" />
</FrameLayout>

Tải bố cục ViewStub

Các đoạn mã trong phần trước tạo ra nội dung như hình 1:

Hình ảnh màn hình trống
Hình 1. Trạng thái ban đầu của màn hình: ViewStub đang ẩn bố cục nặng.

Khi bạn muốn tải bố cục do ViewStub chỉ định, hãy đặt bố cục ở chế độ hiển thị bằng cách gọi setVisibility(View.VISIBLE) hoặc gọi inflate().

Đoạn mã sau đây mô phỏng một quá trình tải bị trì hoãn. Màn hình sẽ tải như bình thường trong ActivityonCreate(), sau đó hiển thị bố cục heavy_layout_we_want_to_postpone:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_old_xml)

  Handler(Looper.getMainLooper())
      .postDelayed({
          findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
          
          // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()
      }, 2000)
}

Java

@Override
void onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_old_xml);

  Handler(Looper.getMainLooper())
      .postDelayed({
          findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
          
          // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()
      }, 2000);
}
Hình 2. Bố cục lớn hiển thị.

Sau khi được hiển thị hoặc tăng cường, phần tử ViewStub không còn là một phần của hệ phân cấp khung hiển thị. Bố cục này được thay thế bằng bố cục được tăng cường và mã nhận dạng cho khung hiển thị gốc của bố cục đó được chỉ định bằng thuộc tính android:inflatedId của ViewStub. Mã nhận dạng android:id được chỉ định cho ViewStub chỉ hợp lệ cho đến khi bố cục ViewStub hiển thị hoặc tăng cường.

Để biết thêm thông tin về chủ đề này, hãy xem bài đăng trên blog Tối ưu hoá với các mã giả lập.