ViewStub是一个不可见的、大小为0的控件,运行时ViewStub可以滞后加载。当ViewStub置为可见或者调用inflate()的时候,布局就会加载出来。用加载进来的布局取代ViewStub在父布局中的位置。因此,ViewStub只有在调用了setVisibility()或者inflate()之后,才会在层级中显示出来。将ViewStub布局参数设置给ViewStub指定加载的布局。同理,你可以用ViewStub的inflatedId定义或者覆盖ViewStub指定加载的布局id,例如:

<ViewStub 
  android:id="@+id/stub"
android:inflatedId="@+id/subTree" --简单的说就是可以在此处指定布局文件mySubTree的根id
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />

    因此,我们可以通过id “stub”找到ViewStub这个控件,布局资源mySubTree加载完之后,ViewStub就会从它的父布局中移除。我们可以通过“subTree”这个id找到这个由布局资源mySubTree创建的view,通过inflatedId这个属性找到这个view。加载进来的新布局被指定宽为120dp,高为40dp。这种加载布局资源的方式如下所示:

ViewStub stub = (ViewStub) findViewById(R.id.stub);
View inflated = stub.inflate();

    当调用inflate方法的时候,加载的布局将取代ViewStub,并且返回这个view的位置。这种方法可以让应用在不执行findViewById这个方法就可以得到布局的引用。以上翻译自官网:https://developer.android.com/reference/android/view/ViewStub.html

    说了这么多到底怎么使用ViewStub这个控件那???首先我们先说一下使用场景:根据某种状态,判断识别并显示某种布局。简单点说,就是A状态下,显示a布局,B状态下,显示b布局。

这种场景大家肯定都遇到过,并且频繁的改变AB状态,就可以频繁的改变ab布局的显示与隐藏。我们之前的方法是将所有控件全都添加到布局上,然后暂时用不到的隐藏掉,需要的时候在显示出来。但是这种做法是极其耗资源的,在加载布局的时候,即使你将暂时不用的控件隐藏掉,但还是会加载进来的,从而耗费了资源。这种时候,官网推荐使用的ViewStub这个控件。

    ViewStub的优点:它是一个轻量级的View,是一个看不见的,不占布局位置,占用资源非常小的控件。我们可以在ViewStub下指定要加载的布局并指定布局id,当我们需要该布局显示的时候,只需要调用ViewStub的inflate()即可。或者setVisibility();

    ViewStub的缺点:ViewStub的inflate()只能调用一次,多次调用会有异常抛出。也就是说我们只能对ViewStub加载的布局控制一次,若想多次控制该布局,需要使用View的可见性来控制。但是ViewStub的setVisibility()和View的可见性达到的效果是一样的,并且setVisibility()可以多次调用。

    最后我在重申一遍ViewStub的使用背景,对view的显示只有一次控制的时候,ViewStub是最好的选择,节省资源。若想多次调用,用View的可见性来实现,用ViewStub的setVisibility()也行。本篇文章参考自http://blog.csdn.net/hitlion2008/article/details/6737537

ViewStub的使用的更多相关文章

  1. ViewStub源码分析

    ViewStub是一种特殊的View,Android官方给出的解释是:一种不可见的(GONE).size是0的占位view,多用于运行时 延迟加载的,也就是说真正需要某个view的时候.在实际项目中, ...

  2. include、merge 、ViewStub

    在布局优化中,Androi的官方提到了这三种布局<include />.<merge />.<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一 ...

  3. Android实战技巧:ViewStub的应用

    在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局.那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在 ...

  4. ViewStub的简单用法和说明

    最近无意间知道了ViewStub,所以特地的去了解了一下 都知道ViewStub是一个不可见的,大小为0的View,实际上跟include差不多,但是ViewStub要更加节约资源.被称为是" ...

  5. Android引导指示层的制作 (ViewStub + SharePreference)

    引导指示界面是个什么鬼东西?一张图即明了:

  6. 【转】Android布局优化之ViewStub

    ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...

  7. Android性能优化之一:ViewStub

    ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...

  8. Android优化——UI优化(三)使用ViewStub延迟加载

    使用ViewStub延迟加载 1.ViewStub延迟加载 ViewStub是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,在需要的时候再加载View,可Java中常见的性能优 ...

  9. ViewStub的简单解析和使用场景

    ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...

随机推荐

  1. nmap

    扫描端口 nmap -v -sS -open -iL iplist.txt -no-stylesheet -oX output.xml -p- -P0 -v 详细信息-sS 隐蔽扫描(半开syn).– ...

  2. iOS8沙盒路径的变化

    iOS8中的的沙盒路径发生了变化 之前是这样的路径,通过NSHomedictionary()获取的家路径 /Users/wupeng/Library/Application Support/iPhon ...

  3. 2016huasacm暑假集训训练五 G - 湫湫系列故事——减肥记I

    题目链接:http://acm.hust.edu.cn/vjudge/contest/126708#problem/G 这是一个01背包的模板题 AC代码: #include<stdio.h&g ...

  4. IE10(去掉文本框的X)

    input[type="text"]::-ms-clear{ display:none;}input[type="text"]::-ms-reveal{ dis ...

  5. 使用DataList实现数据分页的技术

    今天做网站的时候,用到了分页技术,我把使用方法记录下来,以便日后查阅以及帮助新手朋友们. DataList控件可以按照列表的形式显示数据表中的多行记录,但是被显示的多行记录没有分页功能,使用起来不太方 ...

  6. ABP理论学习之MVC视图

    返回总目录 本篇目录 介绍 AbpWebViewPage基类 介绍 ABP通过Abp.Web.Mvc Nuget包集成了MVC视图.因此你可以像常规那样创建MVC视图. AbpWebViewPage基 ...

  7. 我的权限系统设计实现MVC4 + WebAPI + EasyUI + Knockout(一)

    一.前言 之前的博客一直都还没写到框架的实现及权限系统,今天开始写我的权限系统,我以前做过的项目基本上都有权限管理这个模块,但各个系统都会有一些不太一样,有些简单点,有些稍微复杂一点,一句话,我们做的 ...

  8. 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用

    前面的几篇文章已经比较完整地解释了怎么使用Log4Net,但是我们可能需要将Log4Net的日志类封装在自己的类库中,以便C/S或B/S程序进行调用.下面的示例程序简单地分为两层,一个是应用程序层We ...

  9. Hystrix框架5--请求缓存和collapser

    简介 在Hystrix中有个Request的概念,有一些操作需要在request中进行 缓存 在Hystrix调用服务时,如果只是查询接口,可以使用缓存进行优化,从而跳过真实访问请求. 应用 需要启用 ...

  10. [大数据之Spark]——Transformations转换入门经典实例

    Spark相比于Mapreduce的一大优势就是提供了很多的方法,可以直接使用:另一个优势就是执行速度快,这要得益于DAG的调度,想要理解这个调度规则,还要理解函数之间的依赖关系. 本篇就着重描述下S ...