视图加载延迟

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

如果您具有应用将来可能需要的复杂视图,则可以使用延迟加载资源这项重要的方法。您可以通过为复杂且很少使用的视图定义 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> 标记。

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