android stub,Android:ViewStub
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相关推荐
- Android实战技巧:ViewStub的应用
在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局.那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在 ...
- Android性能优化:布局优化 详细解析(含include、ViewStub、merge讲解 )
1. 影响的性能 布局性能的好坏 主要影响 :Android应用中的页面显示速度 2. 如何影响性能 布局影响Android性能的实质:页面的测量 & 绘制时间 1个页面通过递归 完成测量 & ...
- Android性能优化之一:ViewStub
Android性能优化之一:ViewStub 转载于:https://www.cnblogs.com/zhujiabin/p/5223196.html
- [转载]Android Layout标签之-viewStub,requestFocus,merge,include
定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是<viewStub/>, <requestFocus />, ...
- Android 系统性能优化(80)---Android性能优化:这是一份详细的布局优化 指南(含lt;includegt;、lt;Viewstubgt;、lt;mergegt;)
Android性能优化:这是一份详细的布局优化 指南(含<include>.<Viewstub>.<merge>) 前言 在 Android开发中,性能优化策略十分 ...
- Android Layout标签之-viewStub,requestFocus,merge,include
定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是<viewStub/>, <requestFocus />, ...
- Android进阶笔记:Messenger源码详解
Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...
- Android优化五:布局优化
1.减少布局层级 Google在API文档中建议View树的高度不宜超过10层. 以前我们用Eclipse写代码时,自动生成的模板是以LinearLayout为根节点的,但是后面变成了Relative ...
- Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现
Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现 暂时还未有时间开发这效果,所以先贴出来. 先贴一张效果图,这是一张手机截屏: 左上方的风景图:背景图片 右上方的人物图:前景图 ...
- Android应用开发:数据存储和界面展现-2
1. pull解析XML文件 Android推荐使用pull解析XML文件,与SAX解析XML文件类似,都是事件驱动类型的解析方式. 示例:获取天气信息 res\layout\activity_mai ...
最新文章
- nginx启动报错(1113: No mapping for the Unicode character exists in the target multi-byte code page)...
- 单例设计模式八种方式——5) 懒汉式(线程安全,同步代码块) 6) 双重检查 7) 静态内部类 8) 枚举
- java 哈希算法_选择Java密码算法第1部分-哈希
- java中for循环快捷方式_IntelliJ IDEA(快捷键):快速生成各种for循环(示例代码)...
- Linux和DOS常用命令对照表
- 【转】前端开发设计必备的Chrome插件
- ide-eval-resetter
- 阿里系退出吴奇隆刘诗诗公司 仅靠明星光环难留资本
- UVa 10827 - Maximum sum on a torus
- rs.next()的理解
- 数学建模及数据分析上的插值处理——第三部分实践插值实战
- 做实景三维项目后的一些感想
- win7 android双系统,Win7+Android双系统 Acer AOD255评测
- JVM-调优《常见可视化工具与命令行的使用》
- SPI与W25Q128
- 渗透测试sec123笔记
- 理解UDDI(2):UDDI注册信息的数据模型
- java计算机毕业设计宠物店管理系统设计与实现(附源码、数据库)
- chrome调用IE
- 工厂企业安装使用人脸识别考勤系统的好处