Android 高手进阶2---ViewStubs使用

因为 <include />标签,在android中共享和重用UI组件是非常容易的。有事,因为容易统一创建负责的UI以致最后view 非常的多,其中一些我们很少用到。幸运的是,Android给我们提供了一种特殊的叫做“ViewStub的widget,他在不会破坏用户逻辑的同时能个带给我们想<include />一样的好处。

ViewStub 是一种轻量的View,没有大小,不会参与绘图和layout,这就意味着ViewStub 在infalate 和保持视图方面是代价非常小的,ViewStub 可以被认为是一个后的include标签,被ViewStub 引用的layout会在你需要的时候才会被加入到用户的界面中。

下面的截屏来自于Shelves应用。截图的主要是给用户呈现一个可以浏览的图书列表。

 

 

 

同一个Activity同样被使用当用户添加或者导入新书时,在这中操作的过程中,应用程序呈现给用户另外一些元素。下面的截屏中在图底部展示一个进度条和取消按钮。

因为导入书籍操作不是一个很平常的操作,至少和浏览这样的操作是这样的。这里导入的panel就是使用一个viewstub.

 

当用户调用导入操作时,ViewStub 会被inflated而且内容会被指向layout替代。

为了使用ViewStub,你需要指定一个android:id 属性,给stub,一个android:layout 属性给你需要引用的layout,ViewStub允许你使用第三方的属性,android:inflatedId能够被用来覆盖被引用的根view的id,最终,在layout中参数将会被知道包含的根view,这里是一个例子

<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 stub时,inflate()方法将会被调用,你可以简单改变view的可见性最终stub讲个inflate。记住。Inflate方法会形象到被填充的layout;

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

必须记住一点是stub在stubinflate后被移除,因此没必要保存一个长生命周期的引用。例如为类的域变量;

ViewStub 是一中简单编程和高效代码的妥协。代替人工在运行时手动添加view,唯一缺点就是不支持<merge /> tag.标签

posted on 2011-06-14 22:35  lbeing  阅读(1780)  评论(0编辑  收藏  举报

导航