Đô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:
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 Activity
và onCreate()
, 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); }
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.