Layout开发小技巧(三)

4.使用 viewstub

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

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

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

shelf

 

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

progressbar in shelf

 

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

viewstub

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

inflate

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

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

当你准备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的一个缺陷是目前它并不支持 <merge />标签

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值