在书上了解了ViewStub,但只是带过两笔,没能了解。在网上搜索了一些资料,虽然很多文章都讲得比较完善,但是觉得可能是表达的原因,导致某个点上我理解错误,慢慢的才算比较清楚的认识ViewStub。

首先ViewStub的特点,是属于性能优化的控件。ViewStub占用内存少,真真实实的存在于布局文件中,但是ViewStub所占用的内存很少很少。并且ViewStub可以存放一个布局“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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".ViewStubActivity"> <ToggleButton
android:id="@+id/ViewStubButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="ShowViewStub"
android:textOn="Close"
/> <ViewStub
android:id="@+id/ViewStub"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/showimageview"
/>
</RelativeLayout>

看看上面的布局文件,注意ViewStub,其中一个重要的属性就是"android:layout="作用是指定一个需要填充的布局。而这个布局它会替换掉ViewStub,但是ViewStub的width、heigh属性会替换掉这个布局的相应属性。替换掉(inflat)后,ViewStub就相当于消失了。

下面通过所有代码来看看:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/btn_dialog"
android:id="@+id/imageview"> </ImageView>
public class ViewStubActivity extends ActionBarActivity {
private ToggleButton mViewStubButton;
private View nNoDataView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_stub);
mViewStubButton= (ToggleButton) findViewById(R.id.ViewStubButton);
mViewStubButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
if(nNoDataView==null) {//这个判断很重要,保证ViewStub不被inflate()两次
ViewStub mViewStub= (ViewStub) findViewById(R.id.ViewStub);
nNoDataView=mViewStub.inflate();//通过inflate()填充布局
ImageView imageview= (ImageView)nNoDataView.findViewById(R.id.imageview);
}
else{
nNoDataView.setVisibility(View.VISIBLE);
} }else{
nNoDataView.setVisibility(View.GONE);
}
}
}); } }

注意:1、ViewStub在一个Activity中只能被inflate()一次,否则会报错,所以使用View一定要注意好这一点。
   2、假如第一次使用ViewStub.setVisibility(View.VISIBLE)。会调用inflate();要是之后再调用inflate()会报错的。第二次使用ViewStub.setVisibility(View.VISIBLE不会再调用inflate()
   3、对ViewStub调用inflate()后,ViewStub就会被替换掉,它的id都不再存在,若再一次ViewStub mViewStub= (ViewStub) findViewById(R.id.ViewStub);这个mViewStub为空。

  

ViewStub的更多相关文章

  1. ViewStub的使用

    ViewStub是一个不可见的.大小为0的控件,运行时ViewStub可以滞后加载.当ViewStub置为可见或者调用inflate()的时候,布局就会加载出来.用加载进来的布局取代ViewStub在 ...

  2. ViewStub源码分析

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

  3. include、merge 、ViewStub

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

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

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

  5. ViewStub的简单用法和说明

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

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

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

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

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

  8. Android性能优化之一:ViewStub

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

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

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

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

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

随机推荐

  1. MySQL笔记(8)-- 索引类型

    一.背景 前面我们讲了SQL分析和索引优化都涉及到了索引,那么什么是索引,它的模型有什么,实现的机制是什么,今天我们来好好讨论下. 二.索引的介绍 索引就相当书的目录,比如一本500页的书,如果你想快 ...

  2. xheditor图片上传

    前端步骤:分为三部,这三部做完之后就能正确显示富文本了 1.下载xheditor文件,并按照如下要求进行引入: <!-- xheditor富文本的文件引入 --> <script t ...

  3. kali的安装详解--摘自官方

    官方网址:https://www.kali.org/docs/virtualization/install-vmware-workstation-player-kali-guest-vm/ 在VMwa ...

  4. 进制-Adding Two Negabinary Numbers

    2020-02-20 14:52:41 问题描述: 问题求解: 最开始的想法是将两个数字先转化成自然数在求和,最后转化回去,但是实际上这种方案是不可取的,主要的问题就是会爆掉. 那么就得按位进行运算了 ...

  5. 移动深度学习 Mobile-deep-learning(MDL)

    Free and open source mobile deep learning framework, deploying by Baidu. This research aims at simpl ...

  6. K8S 资源收集和展示 top & DashBoard-UI

    一.前言 在近期的 K8S 开发调试的过程中,总会想知道 Node 或者 Pod 的更多信息.但 $ kubectl top node $ kubectl top pod 中的 top 操作符,需要 ...

  7. 【Pytest04】全网最全最新的Pytest框架fixture应用篇(2)

    一.Fixture参数之params参数可实现参数化:(可以为list和tuple,或者字典列表,字典元祖等) 实例如下: import pytest def read_yaml(): '] @pyt ...

  8. [noip模拟]画展<队列的基础知识>

    Description 博览馆正在展出由世上最佳的M位画家所画的图画.人们想到博览馆去看这几位大师的作品.可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字,a和b,代表要看展览中 ...

  9. MATLAB 随机过程基本理论

    一.平稳随机过程 1.严平稳随机过程 clc clear n=0:1000; x=randn(1,1001); subplot(211),plot(n,x); xlabel('n');ylabel(' ...

  10. jenkins集成sonarQube实现代码质量检查

    1.sonarQube的简介 SonarQube是一款自动化代码审查工具,用于检测代码中的错误.漏洞和代码异味.它可以与你现有的工作流集成,以支持跨项目分支和拉取请求的连续代码检查. 其工作流程如下: ...