• 利用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

  • 相关阅读:
    flash不保存在IE缓存中
    pv 3d
    ASP.NET优化
    根据文件名判断文件扩展名 和 根据流真正判断文件类型的关键函数
    as3.0
    编码
    AS3中Event的target和currentTarget
    显示用户IP来源的代码
    启用IIS的Gzip压缩功能
    Css之多个子元素水平平均分布——flex布局法
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/4263231.html
Copyright © 2020-2023  润新知