ViewStub 是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,避免资源浪费,在需要的时候才加载View; 其特性如下: 1、调用其inflate()的时候,其布局属性android...:layout=”@layout/布局”将会替换这个ViewStub标签,这个时候我们使用findViewById将获取这个ViewStub对象为空,所以是可以被替换这一点的; 2、inflate(...viewParent这个错误,我们通过其getParent()判断是否为空,我们就可以知道是否已经加载了; 3、ViewStub的属性在inflate()后会都传给相应的布局。...4、我们ViewStub里面有一个inflateId:,这个是可以给ViewStub要加载的布局重新设置一个id,我们通过这个id可以通过使用findViewById来找到相应的布局; 5、 ViewStub...视图在首次调用setVisibilityinflate方法的时候其实是和inflate加载布局是一样的效果,会让其layout对应的布局加载出来; 6、 ViewStub所要替代的layout文件中不能有标签
一、ViewStub是什么? 标签实质上是一个宽高都为 0 的不可见 的轻量级View。通过延迟按需加载布局的方式提升页面加载速度。...二、ViewStub使用场景 某布局默认是不可见,当满足特定场景才显示。比如网络异常提示、引导页等。 三、ViewStub怎么使用?...1、创建布局文件layout_test.xml(注:根标签可以是布局或控件,但不能为,子标签可以使用) <TextView xmlns:android="http...() //方法2 <em>viewStub</em>.visibility = View.VISIBLE 注:<em>ViewStub</em>只能被Inflate一次,inflate之后<em>ViewStub</em>对象会被置空,就不能够再通过<em>ViewStub</em>...其中方法2内部也是通过调用inflate,所有<em>ViewStub</em>的setVisibility()和inflate()都只能调用一次 (2)需要根据条件进行显隐控制(通过<em>ViewStub</em>.inflate()
相信大家经常听到include、merge、ViewStub这样的标签,官方也提到这三种布局可用于布局的优化。今天就介绍下这三种布局的使用,记录下来,便于后续app中的使用。...3、如果需要给include标签设置位置属性的话,如例子中的layout_below、layout_marginTop,这时候 必须 同时设置include标签的宽高属性layout_width、layout_height...ViewStub按需加载 按需加载 顾名思义需要的时候再去加载,不需要的时候可以不用加载,节约内存使用。...ViewStub的inflate()方法只能被调用一次,一旦调用后,ViewStub将从视图中移除,被对应的layout布局取代,同时会保留ViewStub上设置的属性效果。...ViewStub viewstub = findViewById(R.id.viewstub); viewstub.inflate(); 这篇关于include、merge、ViewStub的使用就介绍到这里了
* * 因此ViewStub会在view布局中存在一直到setVisibility或inflate被调用了。...* * 当被初始化的View添加到ViewStub的父布局时会使用ViewStub的布局属性,因此你可以使用ViewStub的inflatedId属性定义/重写View的id。...在初始化布局subTree之后,这个ViewStub就会从它父布局中移除。...ref android.R.styleable#ViewStub_layout */ @RemoteView public final class ViewStub extends View {...* * * @see android.view.ViewStub#setOnInflateListener(android.view.ViewStub.OnInflateListener) */
可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候, 或是调用了ViewStub.inflate()的时候,ViewStub...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。...(1.)android.view.ViewStub特点: 1.ViewStub只能Inflate一次,之后ViewStub对象会被置为空。...按句话说,某个被ViewStub指定的布局被Inflate后, 就不会够再通过ViewStub来控制它了。...因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。
ViewStub经常用在ListView中,用来隐藏一些操作,使用起来也很简单,主要就是在ListView的Item中通过一个ViewStub来引用被隐藏的布局文件。...(Context.LAYOUT_INFLATER_SERVICE); } class ViewHolder { RelativeLayout rlListItem;// 点击展开或收起ViewStub...= (RelativeLayout) convertView .findViewById(R.id.rl_list_item); viewHolder.vsOperations = (ViewStub...-- 每个ListItem除了ViewStub,都在这个标签里面 --> <RelativeLayout android:id="@+id/rl_list_item"...使用ViewStub的好处是,它并没有实例化这个View对象,而是在用户点击的时候才进行实例化,这样可以提高效率。特别是当你的listItem比较复杂的时候,效果很明显。
可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。 ...首先来说说ViewStub的一些特点: 1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。...按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。 2....因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。
使用时可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时或调用了ViewStub.inflate()的时候,ViewStub...4.3中所讲到的ViewStub指向的布局文件解析inflate并替换掉当前ViewStub本身,并不是完全意义上的替换(与include标签不太一样),替换时,布局文件的layout params是以...减少视图层级merge 标签在UI的结构优化中起着非常重要的作用,它可以删减多余的层级,优化UI。...因为所有的 Activity视图的根结点都是FrameLayout,如果当前的布局根结点是Framelayout,那么可以用merge替代,减少多余的层级)或者当一个布局 包含另一个时,标签消除视图层次结构中多余的视图组...这时可以使用标签进行优化。
今天写一下 ViewStub ,内容很简单! ViewStub 是一个不可见的,没有尺寸,不会绘制任何东西的布局。...在 ViewStub 加载完成后就会被移除,它所占用的空间就会被新的布局替换。还是来说一下具体的用法,比较清晰。 用法 // 在布局文件中,你就当做普通 View 使用即可 <?...android:layout_width="match_parent" android:layout_height="300dp" // 当 ViewStub...加载后,就会被下面这个布局占用 android:layout="@layout/activity_main"/> 加载 ViewStub 的时候可以使用方法...一旦调用上面的方法后 ViewStub 就会变成 null 了。 应用场景 页面本身有一个布局,当由于某些错误,这个布局不加载的时候,这个时候你就可以让 ViewStub 加载你预留的空白布局了。
ViewStub是一个轻量级的的View,继承于ViewGroup,没有任何尺寸,不绘制任何东西,因此绘制或者移除时更省时。...(ViewStub不可见,大小为0) 优点 实现View的延迟加载,避免资源的浪费,减少渲染时间,在需要的时候才加载View 缺点 ViewStub所要替代的layout文件中不能有标签 ViewStub...在加载完后会被移除,或者说是被加载进来的layout替换掉了 用法 用ViewStub...visible/inflated,则ViewStub将从视图框架中移除,其id stub_import也会失效 ViewStub被绘制完成的layout文件取代,并且该layout文件的root view
可以为ViewStub指定一个布局,在Inflate布局的时候,只有 ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。...首先来说说ViewStub的一些特点: 1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。...并替换掉当前ViewStub本身(由此体现出了ViewStub“占位符”性质),一旦替换后,此时原来的 布局文件中就没有ViewStub控件了,因此,如果多次对ViewStub进行infalte,会出现错误信息...5.3中所讲到的ViewStub指向的布局文件解析inflate并替换掉当前 ViewStub本身,并不是完全意义上的替换(与include标签还不太一样),替换时,布局文件的layout params
目录介绍 01.什么是ViewStub 02.ViewStub构造方法 03.inflate()方法解析 04.WeakReference使用 05.ViewStub为何无大小 06.ViewStub为何不绘制...07.可以多次inflate()吗 08.ViewStub不支持merge 09.ViewStub使用场景 10.ViewStub总结分析 好消息 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点...当 ViewStub 变得可见或 inflate() 的时候,布局就会被加载(替换 ViewStub)。...即某个被ViewStub指定的布局被Inflate后,就不能够再通过ViewStub来控制它了。...08.ViewStub不支持merge 不能引入包含merge标签的布局到ViewStub中。
Carson带你学Android性能优化系列文章: Android性能优化:性能优化指南 Android性能优化:布局优化(含标签Include、Viewstub、Merge讲解) Android... & 尽可能少用布局属性 wrap_content 4.4.1 使用 布局标签 作用:按需加载 外部引入的布局,属 轻量级View、不占用显示 & 位置 应用场景:引入 只在特殊情况下才显示的布局...(即 默认不显示),如:进度显示布局、信息出错出现的提示布局等 使用说明 先设置好预显示的布局 在其他布局通过标签引入外部布局(类似);注:此时该布局还未被加载显示 只有当ViewStub被设置为可见...被设置为可见 / 调用了ViewStub.inflate()时,ViewStub所指向的布局文件才会被inflate 、实例化,最终 显示指向的布局 ViewStub stub =...(ViewStub) findViewById(R.id.Blayout); stub.inflate(); 需要特别注意的是: ViewStub中的layout布局不能使用merge标签,否则会报错
ViewStub是一个继承了View类的视图。 2. ViewStub是不可见的,实际上是把宽高都设置为0 3....也就是说,在调用inflate方法之前,ViewStub一直存在于视图树中,当调用inflate之后,ViewStub被加载的视图替换,到此,ViewStub的作用完成,之后ViewStub可能被内存回收...(如果没有声明成成员变量的话,也就是没有强引用) 源码解析: 下面针对ViewStub的特性对源码进行解析: 特性一:ViewStub是一个继承了View类的视图。...标签需要必须通过android:layout属性指定待加载的视图资源文件ID,否则会抛异常(在inflate方法被调用前,通过setLayoutResource也可以设置待加载的视图资源文件ID,但不建议这样做...ViewStub标签的所有android:layout_打头的属性,都会替换待加载视图的跟布局对应属性 最好通过ViewStub的inflate方法加载视图,该方法会返回视图根节点。
将根view添加到父控件中 2.ViewStub 其实ViewStub就是一个宽高都为0的一个View,它默认是不可见的,只有通过调用setVisibility函数或者Inflate函数才会将其要装载的目标布局给加载出来...setContentView(R.layout.main); // 方式1,获取ViewStub, ViewStub listStub =...findViewById的问题,注意ViewStub中是否设置了inflatedId,如果设置了则需要通过inflatedId来查找目标布局的根元素。...标签是这几个标签中最让我费解的,大家可能想不到,标签竟然会是一个Activity,里面有一个LinearLayout对象。...,那么直接将其中的子元素添加到merge标签parent中,这样就保证了不会引入额外的层级。
ViewStub 怎么用 在布局文件中使用ViewStub标签 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26...意思是ViewStub不支持标签....关于不支持标签的程度,我们进行一个简单的验证 验证一:直接标签 如下,我们有布局文件名为merge_layout.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 <merge...验证二 间接的ViewStub 下面布局间接使用了merge标签.文件名为include_merge.xml 1 2 3 4 5 6 7 标签支持良好的.
1.viewstub就是动态加载试图;也就是在我们的app启动绘制页面的时候,他不会绘制到view树中;当在代码中执行inflate操作后,她才会被添加到试图中。...2.看一个简单的demo viewstub.xml "+viewStub); textView = viewStub.findViewById(R.id.hello_tv);//获取到的textview是空的;...我们用layout inspector来查看一下: inflate前:可以看到viewstub是灰色的 inflate后:可以看到viewstub直接被移除了,把引用布局直接放到view树里了。...所以当我们第二次再调用inflate方法时,viewstub的parent已经为空了;就会抛出此异常; 当调用textView = viewStub.findViewById(R.id.hello_tv
这时可以使用标签优化。...各种不常用的布局想进度条、显示错误消息等可以使用标签,以减少内存使用量,加快渲染速度。是一个不可见的,大小为0的View。...标签使用如下: <ViewStub android:id="@+id/stub_import" android:inflatedId="@+id/panel_import...注:ViewStub目前有个缺陷就是还不支持 标签。...更多标签介绍可以参考《Android Layout Tricks #3: Optimize with stubs》 /** * @author 张兴业 * http:
的view,不甚理解, 我一直认为分析一个原生控件的最好办法就是查看源码以及demo演示,所以先看下ViewStub源码中的说明 根据源码可以获得以下信息 1,ViewStub继承自View 2,ViewStub...()方法时,ViewStub得到填充,此时viewstub所引用的layout布局会代替掉viewstub控件显示出来,也就是说在调用setVisible(int)或者inflate()方法之前,UI中只有一个大小为...0的viewstub。...在代码中进行引用 在代码中通过id获取到对ViewStub的引用,然后调用inflate方法,调用该方法后mySubTree布局会代替ViewStub。...ViewStub会被从它的parent中移除.通过inflateID:subTree可以在代码中引用到mySubTree ViewStub stub = (ViewStub) findViewById
可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。...首先来说说ViewStub的一些特点: 1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。...按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。 2....因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。
领取专属 10元无门槛券
手把手带您无忧上云