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

时间: 2024-12-20 18:37:37

利用ViewStub来延迟加载视图的相关文章

Android性能优化之提高应用响应速度(了解ViewStub和推迟视图的初始化)

为什么需要推迟视图初始化 这里谈谈为什么要推迟视图的初始化. 假设这样一个情况, 如果手机的界面包含大量的视图组件,而且数据大多都来源于服务器. 这就意味着一进入这个界面,应用就会在onCreate()方法中去初始化为数不少的layout资源, 而初始化View是一个比较耗时耗资源的操作. 然后, 应用进行几个网络链接,去获取数据回来更新填充View中的各个组件. 这样算起来, 用户从进入某个Activity, 到真的看到该Activity的视图, 所需等待的时间确实不短.  而且要知道, 应用

Android ViewStub 布局延迟加载

ViewStub本身只占一点内存空间 在调用inflate后  才加载layout属性所指向的layout, 以替换当前ViewStub所占的位置 在某些 需要选择显示何种布局时,就可以使用ViewStub来延迟加载 注意:inflate只能有一次 layout: activity_view_stub.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:lay

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类.指定数据库连接字符串以及创建一个数据库.最后,我们还将添加视图和控制器来管理和显式产品和分类数据. 注意:如果你想按照本章的代码编写示例,你必须完成第一章或者直接从www.apress.com下载第一章的源代码. 2.1 添加模型类 Entity Framework的代码优先模式允许我们从模型类创

延迟加载和插入视图

当我们需要为App中的每个View都添加一个header或者footer时,你会怎么做? 重复地复制粘贴可以解决这个问题,但未免太繁杂.可以试着使用<include />标签: 第一种方式,在<include />标签内指定width及height: main.xml <RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_wid

Android 性能优化 三 布局优化ViewStub标签的使用

小黑与小白的故事,通过虚拟这两个人物进行一问一答的形式来共同学习ViewStub的使用 小白:Hi,小黑,ViewStub是什么?听说可以用来进行布局优化. 小黑:ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件.(更多详细的API等信息可以查看官方文档ViewStub),计算机行业一向是实践里面出真知,下面用一个例子演示下效果. 小黑:说说概念只是为了概括性的了解下,还是用个实例来演示下.先来创建一个Activity中使用的布局文件,文件名是:act

【IOS开发—视图控制器】

一.UIViewController 视图控制器是UIViewController类或者其子类对象,每个视图控制器都负责管理一个视图层次结构.在UIViewController中有一个重要的UIView属性, 这个view就是这个视图层的根视图,当程序将view作为子视图加入窗口时,也会加入UIViewController对象所管理的整个视图层次结构. 视图控制器只有在将某个视图显示在屏幕上时,相应的视图控制器才会创建其视图,这种延迟加载视图的做法能提高内存的使用效率.视图控制器创建视图的方式有

SQL 视图

视图: 1.视图的概述       视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据.视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表.视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义在基表上的触发器.(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束) 2.视图的存储       与表不同,视图不会要求分配存储空间,视图中也不会包含实际的数据.视图只是定义了一个

存储过程,视图

存储过程: 存储过程(stored procedure)有时也称为sproc.存储过程存储于数据库中而不是在单独的文件中,有输入参数.输出参数以及返回值等. 在数据库中,创建存储过程和创建其他对象的过程一样,除了它使用的AS关键字外.存储过程的基本语法如下: CREATE PROCDUER|PROC <sproc name> [<parameter name>[schema.]<data type>[VARYING][=<default value>][OU

学习笔记:Asp.Net MVC更新部分视图实现

Asp.Net MVC 更新部分视图实现 设想我们有一篇文章下面的提交评论时如何只刷新评论内容部分, 方法一,利用ajax通过js代码实现. 方法二,利用Ajax.BeginForm()+部分视图实现. 通过js代码的方法比较常见,这里主要是探讨通过Ajax.BeginForm()+部分视图的方式实现.这样还可提高该视图的重用性.同理,有多处引用的零部件或页面部分内容更新等,也可以利用此方法实现. Step1,创建生成Form的Action,代码如下: [ChildActionOnly()] p