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

Đôi khi, bố cục của bạn đòi hỏi các khung hiển thị phức tạp và hiếm khi được sử dụng. Liệu đó là thông tin chi tiết về mặt hàng, chỉ báo tiến trình hoặc thông báo huỷ, bạn 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 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 khiến ứng dụng trong tương lai bằng cách xác định ViewStub cho khung hiển thị phức tạp và hiếm khi được sử dụng.

Xác định ViewStub

ViewStub là chế độ xem gọn nhẹ, không có kích thước không vẽ bất kỳ thứ gì hoặc tham gia vào bố cục. Như vậy, bạn cần ít nguồn lực để tăng cường và rời khỏi 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 sẽ tăng cường.

Giả sử bạn có bố cục và muốn tải sau trong hành trình của người dùng ứ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. Để thực hiện bố cục hiển thị hoặc tải bất kỳ nội dung nào, bạn phải hiển thị bố cục được giới thiệu:

<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ột màn hình trống
Hình 1. Trạng thái ban đầu của màn hình: ViewStub là ẩn bố cục nặng.

Khi bạn muốn tải bố cục do ViewStub chỉ định, đặt màn hình ở 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 hoạt động tải bị trì hoãn. Màn hình tải dưới dạng thông thường trong ActivityonCreate(), sau đó nó sẽ 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 nặng hiện rõ.

Sau khi hiển thị hoặc được tăng cường, phần tử ViewStub không còn là một phần nữa của hệ phân cấp khung hiển thị. Nó được thay thế bằng bố cục được phóng to và mã nhận dạng cho khung hiển thị gốc của bố cục đó được chỉ định bởi android:inflatedId của ViewStub. Mã android:id được chỉ định cho ViewStub chỉ hợp lệ cho đến ViewStub được 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á còn mã giả lập.