Layout开发小技巧(三)

4.使用 viewstub

使我们能够在Android中方便的共享和复用UI组件. 有时候,我们创建了一个复杂的组件,但是其中有些view,我们很少使用.为了避免android每一次不必要的渲染,android提供了一个非常特别的控件,名字叫做viewstub.它可以给我们带来的所有好处,并且不会污染以前的layout.

viewstub是一个潜在的轻量级的视图,它没有尺寸,它不绘制任何东西,并且在任何时候都不参与到layout中.这就意味着ViewStub 很容易被inflate 并且很方便就被存放在一个视图继承表里.viewstub可以被形象地描述成一个懒惰的,layout 的引用仅仅只当你决定把它inflate或者呈现在用户面前时,它才运作.

以下是一个书架应用程序,该程序向用户展示了一个可供浏览的图书列表:

 

同样的activity被使用,并且用户添加了一些重要的新的图书.在这个操作过程中,用户界面显示有所不同,在图书导入的过程中,在屏幕的底部出现了一个progressbar和一个cancel按钮.

 

与浏览list相比,导入书籍并不是一个普遍的操作,这个重要的画面一开始是用一个ViewStub来表示的:

当用户初始化导入过程时,ViewStub 被inflated 并被它所引用的layout的内容所替代:

为了使用ViewStub,你仅仅只需要定义一个android:id 属性,和一个 android:layout 属性来指定将来由哪一个layout来替代这个ViewStub,而 android:inflatedId用来覆盖之前被inflate进来的那个layout的id,如下例:


 
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" />

当你准备inflate这个ViewStub时,你只需要调用inflate方法就可以完成这个功能.你可以设置这个ViewStub为可见或者不可见.

inflate() 方法可以将得到的view返回给ViewStub的父节点

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

需要注意的是,当我们inflate ViewStub之后,这个Stub已经被视图继承表中移除.正因为如此,我们没有必要保持一个长时间的引用,例如对ViewStub的一个引用.

使用ViewStub的一个缺陷是目前它并不支持 标签

 

你可能感兴趣的:(android应用开发)