ViewStub 是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,避免资源浪费,在需要的时候才加载View; 其特性如下: 1、调用其inflate()的时候,其布局属性android...:layout=”@layout/布局”将会替换这个ViewStub标签,这个时候我们使用findViewById将获取这个ViewStub对象为空,所以是可以被替换这一点的; 2、inflate(...)加载会返回一个View,这个View就是其layout属性对应的那个View,inflate()这个方法只能调用依次,如果再次调用会报ViewStub must have a non-null ViewGroup...viewParent这个错误,我们通过其getParent()判断是否为空,我们就可以知道是否已经加载了; 3、ViewStub的属性在inflate()后会都传给相应的布局。...4、我们ViewStub里面有一个inflateId:,这个是可以给ViewStub要加载的布局重新设置一个id,我们通过这个id可以通过使用findViewById来找到相应的布局; 5、 ViewStub
一、ViewStub是什么? 标签实质上是一个宽高都为 0 的不可见 的轻量级View。通过延迟按需加载布局的方式提升页面加载速度。...二、ViewStub使用场景 某布局默认是不可见,当满足特定场景才显示。比如网络异常提示、引导页等。 三、ViewStub怎么使用?...layout_width="wrap_content" android:layout_height="40dp" android:text="test"/> 2、通过ViewStub...() //方法2 viewStub.visibility = View.VISIBLE 注:ViewStub只能被Inflate一次,inflate之后ViewStub对象会被置空,就不能够再通过ViewStub...其中方法2内部也是通过调用inflate,所有ViewStub的setVisibility()和inflate()都只能调用一次 (2)需要根据条件进行显隐控制(通过ViewStub.inflate()
* * 因此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指定一个布局,在Inflate布局的时候,只有 ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。...首先来说说ViewStub的一些特点: 1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。...,且此布局文件直 接将当前ViewStub替换掉,具体是通过viewStub.infalte()或 viewStub.setVisibility(View.VISIBLE)来完成; 3.正确把握住ViewStub...并替换掉当前ViewStub本身(由此体现出了ViewStub“占位符”性质),一旦替换后,此时原来的 布局文件中就没有ViewStub控件了,因此,如果多次对ViewStub进行infalte,会出现错误信息
可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。 ...首先来说说ViewStub的一些特点: 1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。...按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。 2....因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么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是一个轻量级的的View,继承于ViewGroup,没有任何尺寸,不绘制任何东西,因此绘制或者移除时更省时。...(ViewStub不可见,大小为0) 优点 实现View的延迟加载,避免资源的浪费,减少渲染时间,在需要的时候才加载View 缺点 ViewStub所要替代的layout文件中不能有标签 ViewStub...在加载完后会被移除,或者说是被加载进来的layout替换掉了 用法 用ViewStub...visible/inflated,则ViewStub将从视图框架中移除,其id stub_import也会失效 ViewStub被绘制完成的layout文件取代,并且该layout文件的root view
今天写一下 ViewStub ,内容很简单! ViewStub 是一个不可见的,没有尺寸,不会绘制任何东西的布局。...在 ViewStub 加载完成后就会被移除,它所占用的空间就会被新的布局替换。还是来说一下具体的用法,比较清晰。 用法 // 在布局文件中,你就当做普通 View 使用即可 <?...android:layout_width="match_parent" android:layout_height="300dp" // 当 ViewStub...加载后,就会被下面这个布局占用 android:layout="@layout/activity_main"/> 加载 ViewStub 的时候可以使用方法...一旦调用上面的方法后 ViewStub 就会变成 null 了。 应用场景 页面本身有一个布局,当由于某些错误,这个布局不加载的时候,这个时候你就可以让 ViewStub 加载你预留的空白布局了。
推荐的做法是使用android.view.ViewStub,ViewStub是一个轻量级的View,使用非常简单: mViewStub = (ViewStub) this.findViewById(R.id.viewstub...使用时可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时或调用了ViewStub.inflate()的时候,ViewStub...看方法名字就知道了,this是代表ViewStub对象,意思就是把当前ViewStub对象从父视图中移除了。...inflate,且此布局文件直接将当前ViewStub替换掉,具体是通过viewStub.infalte()或viewStub.setVisibility(View.VISIBLE)来完成。...ViewStub控件了,因此,如果多次对ViewStub进行infalte,会出现错误信息:ViewStub must have a non-null ViewGroup viewParent。
目录介绍 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中。
将根view添加到父控件中 2.ViewStub 其实ViewStub就是一个宽高都为0的一个View,它默认是不可见的,只有通过调用setVisibility函数或者Inflate函数才会将其要装载的目标布局给加载出来...,示例如下 : <ViewStub android:id="@+id/stub_import" android:inflatedId="@+id/stub_comm_lv"...setContentView(R.layout.main); // 方式1,获取ViewStub, ViewStub listStub =...); // 获取到评论ListView,注意这里是通过ViewStub的inflatedId来获取 ListView commLv = findViewById...findViewById的问题,注意ViewStub中是否设置了inflatedId,如果设置了则需要通过inflatedId来查找目标布局的根元素。
ViewStub是一个继承了View类的视图。 2. ViewStub是不可见的,实际上是把宽高都设置为0 3....也就是说,在调用inflate方法之前,ViewStub一直存在于视图树中,当调用inflate之后,ViewStub被加载的视图替换,到此,ViewStub的作用完成,之后ViewStub可能被内存回收...(如果没有声明成成员变量的话,也就是没有强引用) 源码解析: 下面针对ViewStub的特性对源码进行解析: 特性一:ViewStub是一个继承了View类的视图。...public final class ViewStub extends View { 特性二:ViewStub是不可见的,实际上是把宽高都设置为0 @Override protected void...ViewStub标签的所有android:layout_打头的属性,都会替换待加载视图的跟布局对应属性 最好通过ViewStub的inflate方法加载视图,该方法会返回视图根节点。
ViewStub是什么 ViewStub是View的子类 它不可见,大小为0 用来延迟加载布局资源 注,关于Stub的解释 A stub is a small program routine that...ViewStub使用场景 ?...如果默认加载子话题的View,则会造成内存的占用和CPU的消耗 所以,这时候就ViewStub就派上用处了.使用ViewStub可以延迟加载布局资源....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不支持标签.
更多介绍可以参考《Android Layout Tricks #3: Optimize by merging》 3、需要时使用 ...各种不常用的布局想进度条、显示错误消息等可以使用标签,以减少内存使用量,加快渲染速度。是一个不可见的,大小为0的View。...标签使用如下: <ViewStub android:id="@+id/stub_import" android:inflatedId="@+id/panel_import...(R.id.stub_import)).inflate(); 当调用inflate()函数的时候,ViewStub被引用的资源替代,并且返回引用的view。...注:ViewStub目前有个缺陷就是还不支持 标签。
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
的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是做不到的。
3.ViewStub ViewStub有点类似于懒加载,就是什么时候需要加载相关视图了,在做显示。...调用完成ViewStub被销毁 // 如果再次点击按钮,会抛出异常"ViewStub must have a non-null ViewGroup viewParent"...ViewStub viewStub = findViewById(R.id.vs_main); if(viewStub !...= null){ viewStub.inflate(); //这里注意ViewStub只是一个容器,所以在其显示后,其中的...image.png ViewStub内容已加载的布局层级: ? image.png ViewStub标签使用注意点: 1,ViewStub标签不支持merge标签。
image.png 什么是ViewStub 1. ViewStub 是一个看不见的,没有大小,不占布局位置的 View,可以用来懒加载布局。 2....当 ViewStub 变得可见或 inflate() 的时候,布局就会被加载(替换 ViewStub)。...ViewStub只能被Inflate一次,inflate之后ViewStub对象就会被置为空。即某个被ViewStub指定的布局被Inflate后,就不能够再通过ViewStub来控制它了。 2....可以多次inflate()吗 ViewStub对象只可以Inflate一次,之后ViewStub对象会被置为空。...ViewStub不支持merge 不能引入包含merge标签的布局到ViewStub中。
领取专属 10元无门槛券
手把手带您无忧上云