延迟加载视图

有时,您的布局可能需要很少使用的复杂视图。无论是作品详情、进度指示器还是撤消消息,您都可以通过仅在需要时加载这些视图来减少内存使用量并加快渲染速度。

如果您具有应用将来可能需要的复杂视图,则可以使用延迟加载资源这种重要的方法。您可以通过为复杂且很少使用的视图定义 ViewStub 来实现此方法。

定义 ViewStub

ViewStub 是一种没有任何维度的轻量型视图,它不会绘制任何内容或参与布局。因此,无论是让它膨胀,还是将其留在视图层次结构中,成本都比较低。每个 ViewStub 只需包含 android:layout 属性即可指定要膨胀的布局。

以下 ViewStub 适用于半透明进度条叠加层。只有当新的项导入应用中时,它才会显示。

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

加载 ViewStub 布局

如果要加载 ViewStub 指定的布局,可通过调用 setVisibility(View.VISIBLE) 将其设置为可见,或调用 inflate()

Kotlin

findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
// or
val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()

Java

findViewById(R.id.stub_import).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();

注意inflate() 方法会在完成后返回膨胀的 View。因此,如果您需要与布局互动,则无需调用 findViewById()

该布局可见/膨胀之后,ViewStub 元素将不再是视图层次结构的一部分。它会被替换为经过膨胀的布局,该布局的根视图的 ID 便是由 ViewStub 的 android:inflatedId 属性指定的那个 ID。(为 ViewStub 指定的 ID android:id 仅在 ViewStub 布局可见/膨胀之前有效。)

注意ViewStub 的一个缺点是它目前不支持要膨胀的布局中的 <merge> 标记。

如需详细了解此主题,请参阅使用桩进行优化(博文)