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.标签