📜  Android ViewStub(1)

📅  最后修改于: 2023-12-03 14:59:15.842000             🧑  作者: Mango

Android ViewStub

Android ViewStub是一个轻量级、惰性加载的View,它可以在运行时动态地将布局文件中的一个代表性标签替换为另一个布局。

ViewStub方便我们在程序中避免在启动时就进行复杂的布局显示,而是等到需要加载布局的时候再进行加载,从而优化性能。

用法

ViewStub有两种用法:一种是以静态方式在xml布局文件中定义;另一种是以编程方式动态地创建和设置。

静态方式

可将ViewStub视为一个不可见的View对象,它可以在需要时查询并装载其定义的布局文件。定义ViewStub的xml语法如下:

<ViewStub
    android:id="@+id/stub_view"
    android:layout="@layout/layout_stub"
    android:inflatedId="@+id/inflated_view"
    android:visibility="gone" />

其中,id属性是必需的;layout属性是要装载的布局文件;inflatedId是装载布局的 id属性。visibility属性表示视图的可见性,通常设置为gone。

在需要打开ViewStub时,可调用ViewStub的inflate方法,inflate方法可以返回装载的布局对象。例如:

ViewStub stub = findViewById(R.id.stub_view);
View inflatedView = stub.inflate();

inflate()会自动装载指定的布局文件,所以我们不需要自己手动添加。

动态方式

ViewStub也可以通过编程方式创建,其语法如下:

ViewStub stub = new ViewStub(context);
stub.setLayoutParams(new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT));
stub.setInflatedId(R.id.inflated_view);
stub.setLayoutResource(R.layout.layout_stub);

其中,setLayoutResource()方法可设置要装载的布局文件,setInflatedId()方法可设置装载布局的id属性。然后,将ViewStub对象添加到另一个视图对象中:

LinearLayout.LayoutParams layoutParams =
        new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
layout.addView(stub, layoutParams);
注意事项
  • ViewStub只能装载一个布局文件。
  • 为了确保在装载区域中具有高度或宽度,ViewStub的布局属性必须指定在ViewGroup中,例如LinearLayout、RelativeLayout、FrameLayout等等。
  • 在ViewStub对象通过inflate()被装载之前,它所代表的布局视图不可见。
  • 每次inflate()都会执行一次布局装载,所以应尽可能地减少inflate()方法的使用。
  • 与其它View对象不同,ViewStub可以被不可见和回收。
总结

ViewStub是非常有用和灵活的布局工具,可以帮助减少启动时间和内存开销。但是在使用ViewStub的同时,也需要注意它的一些限制和使用约束。