4.使用 viewstub
viewstub是一个潜在的轻量级的视图,它没有尺寸,它不绘制任何东西,并且在任何时候都不参与到layout中.这就意味着ViewStub 很容易被inflate 并且很方便就被存放在一个视图继承表里.viewstub可以被形象地描述成一个懒惰的
以下是一个书架应用程序,该程序向用户展示了一个可供浏览的图书列表:
同样的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的一个缺陷是目前它并不支持