ViewStub是一个轻量级View,它是一个看不见的,并且不占布局位置,占用资源非常小的视图对象。可以为ViewStub指定一个布局,加载布局时,只有ViewStub会被初始化,然后当ViewStub被设置为可见时,或者是调用了ViewStub.inflate()时,ViewStub所指向的布局会被加载和实例化,然后ViewStub的布局属性都会传给它指向的布局。这样就可以使用ViewStub来设置是否显示某个布局。

android:inflatedId="@+id/inflatedId"

android:id="@+id/viewStub"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout="@layout/layout_inflate_view_stub"/>

ViewStub是继承自View,设置它的可见性,可以通过ViewStub#setVisibility()和ViewStub#inflate()。

先看ViewStub#setVisibility()方法。

private WeakReference mInflatedViewRef;

public void setVisibility(int visibility) {

if (mInflatedViewRef != null) {

View view = mInflatedViewRef.get();

if (view != null) {

view.setVisibility(visibility);

} else {

throw new IllegalStateException("setVisibility called on un-referenced view");

}

} else {

super.setVisibility(visibility);

if (visibility == VISIBLE || visibility == INVISIBLE) {

inflate();

}

}

}

初次调用该方法,mInflatedViewRef=null。因此会先走else逻辑。先通过super.setVisibility()调用View的setVisibility方法,更改相关的标志。然后无论设置的是View.VISIBLE或者是View.INVISIBLE都会去调用ViewStub#inflate()方法。如果mInflatedViewRef!=null,就是正常的设置可见性。

再看View#inflate()方法。在xml布局中ViewStub节点下android:layout引入的布局会将ViewStub替换掉,并且ViewStub的宽高等属性会被该布局使用。

public View inflate() {

final ViewParent viewParent = getParent();

if (viewParent != null && viewParent instanceof ViewGroup) {

if (mLayoutResource != 0) {

final ViewGroup parent = (ViewGroup) viewParent;

/*

inflateViewNoAdd()方法被填充的布局生成View对象。如果为ViewStub设置了属性inflatedId,那么这里的view的id会被替换成该inflatedId。

*/

final View view = inflateViewNoAdd(parent);

//将ViewStub替换成被填充的布局,并使用了ViewStub的属性。

replaceSelfWithView(view, parent);

mInflatedViewRef = new WeakReference<>(view);

if (mInflateListener != null) {

//监听事件需要在inflate()或者setVisibility()之前调用。

mInflateListener.onInflate(this, view);

}

return view;

} else {

throw new IllegalArgumentException("ViewStub must have a valid layoutResource");

}

} else {

throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");

}

}

最后说一下id相关。

android:inflatedId="@+id/inflatedId"

android:id="@+id/viewStub"

... />

这里定义了id和inflatedId。id是通过findViewById来获取ViewStub的。inflatedId则是获取被填充的布局,前提是调用了ViewStub#setVisibility()或者ViewStub#inflate()方法。inflatedId是在方法inflateViewNoAdd()中设置给被填充的布局的。

使用ViewStub需要注意的地方。

ViewStub只能加载一次。这个可以从方法replaceSelfWithView看出来。因此ViewStub不适合需要按需隐藏的情况。

private void replaceSelfWithView(View view, ViewGroup parent) {

final int index = parent.indexOfChild(this);

//移除ViewStub

parent.removeViewInLayout(this);

final ViewGroup.LayoutParams layoutParams = getLayoutParams();

//添加被填充的布局

if (layoutParams != null) {

parent.addView(view, index, layoutParams);

} else {

parent.addView(view, index);

}

}

ViewStub不能嵌套merge标签

一般使用场景。

程序运行期间,某个布局在加载后,就不会有变化,除非销毁该页面再重新加载。

想要控制显示与隐藏的是一个布局文件,而非某个view。

android stub,Android:ViewStub相关推荐

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

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

  2. Android性能优化:布局优化 详细解析(含include、ViewStub、merge讲解 )

    1. 影响的性能 布局性能的好坏 主要影响 :Android应用中的页面显示速度 2. 如何影响性能 布局影响Android性能的实质:页面的测量 & 绘制时间 1个页面通过递归 完成测量 & ...

  3. Android性能优化之一:ViewStub

    Android性能优化之一:ViewStub 转载于:https://www.cnblogs.com/zhujiabin/p/5223196.html

  4. [转载]Android Layout标签之-viewStub,requestFocus,merge,include

    定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是<viewStub/>, <requestFocus />, ...

  5. Android 系统性能优化(80)---Android性能优化:这是一份详细的布局优化 指南(含lt;includegt;、lt;Viewstubgt;、lt;mergegt;)

    Android性能优化:这是一份详细的布局优化 指南(含<include>.<Viewstub>.<merge>) 前言 在 Android开发中,性能优化策略十分 ...

  6. Android Layout标签之-viewStub,requestFocus,merge,include

    定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是<viewStub/>, <requestFocus />, ...

  7. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  8. Android优化五:布局优化

    1.减少布局层级 Google在API文档中建议View树的高度不宜超过10层. 以前我们用Eclipse写代码时,自动生成的模板是以LinearLayout为根节点的,但是后面变成了Relative ...

  9. Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现

    Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现 暂时还未有时间开发这效果,所以先贴出来. 先贴一张效果图,这是一张手机截屏: 左上方的风景图:背景图片 右上方的人物图:前景图 ...

  10. Android应用开发:数据存储和界面展现-2

    1. pull解析XML文件 Android推荐使用pull解析XML文件,与SAX解析XML文件类似,都是事件驱动类型的解析方式. 示例:获取天气信息 res\layout\activity_mai ...

最新文章

  1. nginx启动报错(1113: No mapping for the Unicode character exists in the target multi-byte code page)...
  2. 单例设计模式八种方式——5) 懒汉式(线程安全,同步代码块) 6) 双重检查 7) 静态内部类 8) 枚举
  3. java 哈希算法_选择Java密码算法第1部分-哈希
  4. java中for循环快捷方式_IntelliJ IDEA(快捷键):快速生成各种for循环(示例代码)...
  5. Linux和DOS常用命令对照表
  6. 【转】前端开发设计必备的Chrome插件
  7. ide-eval-resetter
  8. 阿里系退出吴奇隆刘诗诗公司 仅靠明星光环难留资本
  9. UVa 10827 - Maximum sum on a torus
  10. rs.next()的理解
  11. 数学建模及数据分析上的插值处理——第三部分实践插值实战
  12. 做实景三维项目后的一些感想
  13. win7 android双系统,Win7+Android双系统 Acer AOD255评测
  14. JVM-调优《常见可视化工具与命令行的使用》
  15. SPI与W25Q128
  16. 渗透测试sec123笔记
  17. 理解UDDI(2):UDDI注册信息的数据模型
  18. java计算机毕业设计宠物店管理系统设计与实现(附源码、数据库)
  19. chrome调用IE
  20. 工厂企业安装使用人脸识别考勤系统的好处

热门文章

  1. Simple QQLogin 2.1(QQ登陆器,适用于 QQ2009 或更新版本)
  2. 设计师配色宝典:教你从零开始学配色
  3. JS下载地图离线数据,前端下载谷歌离线地图
  4. Struts2到底为我们做了什么
  5. 排队论(Queuing Theory)
  6. MPQ4573:和“讨厌”的二极管说拜拜
  7. 系统测试计划编写(四)
  8. JSP中退出登录销毁Session
  9. 变革中的技术——2010-2011回顾与展望
  10. (Adobe Premiere Pro CS4)[ISO]《Adobe非线性视频编辑软件》