利用ViewStub来延迟加载视图

  很多情况下,我们的视图可能会随着用户的操作的不同而变化,比如一个新的页面包含多个控件,但仅仅在用户点击这个按钮后,所有的控件才能完全显示。也就是说一上来可能就显示一个控件,点击按钮后把其他隐藏的控件再显示出来。一般情况下我们通过改变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

原文地址:https://www.cnblogs.com/tianzhijiexian/p/4263231.html