很多情况下,我们的视图可能会随着用户的操作的不同而变化,比如一个新的页面包含多个控件,但仅仅在用户点击这个按钮后,所有的控件才能完全显示。也就是说一上来可能就显示一个控件,点击按钮后把其他隐藏的控件再显示出来。一般情况下我们通过改变View的visible属性来设置view的可见性,但它不算是延迟加载。我们想要的不是一个view被隐藏,而是这个view在点击按钮前根本没被绘制,这该怎么实现呢?通过ViewStub!
ViewStub是一个不可见、不占空间(zero-sized)的控件,它可以用来在运行时延迟加载视图资源。只有当我们将ViewStub的可见性设为true,或者调用inflate()方法,它的视图资源才会被加载。
例子:
在activity中有多个view,其中我们想让一个textview在点击按钮后才被绘制。我们就必须要定义一个ViewStub控件来包含它。
<ViewStub android:id ="@+id/view_stub" android:layout_width ="fill_parent" android:layout_height ="fill_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout ="@layout/stub" />
上面layout中的stub就是一个TextView,代码如下:
stub.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30sp" android:text="ViewStub" /> </RelativeLayout>
完整的activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <ImageView android:id="@+id/imageView" android:layout_width="200dp" android:layout_height="200dp" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:src="@drawable/ic_launcher" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="55dp" android:text="Button" />
<!-- 下方为viewStub --!>
<ViewStub android:id ="@+id/view_stub" android:layout_width ="fill_parent" android:layout_height ="fill_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:inflatedId ="@+id/map_view" android:layout ="@layout/stub" /> </RelativeLayout>
这样,你可以在按钮被点击时触发viewSub.setVisibility(View.VISIBLE),开始从零绘制这个TextView,实现真正的延迟加载。
final ViewStub viewSub = (ViewStub)findViewById(R.id.view_stub); Button btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO 自动生成的方法存根 viewSub.setVisibility(View.VISIBLE); } });
也许当你只将其应用在一个简单的页面当中时,并不会感觉到在性能上有任何提升,但是在复杂页面中,它的效果是极佳的。
参考自:
http://www.open-open.com/lib/view/open1422429191876.html