的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 是一个不可见的,大小为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怎么使用?...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()
* * 因此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) */
推荐的做法是使用android.view.ViewStub,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。...可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候, 或是调用了ViewStub.inflate()的时候,ViewStub...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。...(1.)android.view.ViewStub特点: 1.ViewStub只能Inflate一次,之后ViewStub对象会被置为空。...因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。
推荐的做法是使用android.view.ViewStub,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。...可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。 ...首先来说说ViewStub的一些特点: 1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。...因为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比较复杂的时候,效果很明显。
); mViewStub.inflate(); 它一个不可见的,不占布局位置,占用资源非常小的控件,相当于一个“占位控件”。...2.正确把握住ViewStub的应用场景非常重要,因为使用ViewStub可以优化布局,一般应用在当前布局或控件在用户使用较少情况下,这样可以提高性能,节约内存,加快界面渲染。...ViewStub控件了,因此,如果多次对ViewStub进行infalte,会出现错误信息:ViewStub must have a non-null ViewGroup viewParent。...5.ViewStub本身是不可见的,对ViewStub.setVisibility(int visibility)与其他View控件不一样,我们可以从源码角度来看一下ViewStub.setVisibility...被替换的布局中的控件,直接findViewById即可。
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="@layout/activity_main"/> 加载 ViewStub 的时候可以使用方法...一旦调用上面的方法后 ViewStub 就会变成 null 了。 应用场景 页面本身有一个布局,当由于某些错误,这个布局不加载的时候,这个时候你就可以让 ViewStub 加载你预留的空白布局了。...如果提前写两套布局,根据状态使用 VISIBILBE 来调整的话,这种是你在进入这个页面,布局上面所有的控件都会加载,是会浪费资源的(有了这个空白布局一直就处于不显示状态的话)
推荐的做法是使用android.view.ViewStub,ViewStub 是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。...可以为ViewStub指定一个布局,在Inflate布局的时候,只有 ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。...并替换掉当前ViewStub本身(由此体现出了ViewStub“占位符”性质),一旦替换后,此时原来的 布局文件中就没有ViewStub控件了,因此,如果多次对ViewStub进行infalte,会出现错误信息...6.ViewStub本身是不可见的,对 ViewStub setVisibility(..)与其他控件不一样,ViewStub的setVisibility 成View.VISIBLE或INVISIBLE
目录介绍 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的优势在于在上面的场景中,并不一定需要把所有的内容都展示出来,可以隐藏一些View视图,待用户需要展示的时候再加载到当前的Layout中,这个时候就可以用到ViewStub这个控件了,这样可以减少资源的消耗...那么就有了之前开发使用的状态管理器开源库,就是采用了ViewStub这个控件,让View状态的切换和Activity彻底分离开。
1.3 控件ID相同时的处理 在1.1中我们知道了id属性可以重写include布局的根布局id,但对于根布局里面的布局和控件是无能为力的,如果这时一个布局在主布局中include了多次,那怎么区别里面的控件呢...从这里也可以看出merge的局限性,即你需要明确将merge里面的布局和控件include到什么类型的布局中,才能提前设置好merge里面的布局和控件的位置。...3.3 操作布局控件 仔细比较一下,其实ViewStub就像是一个懒惰的include,我们需要它加载时才加载。...要操作布局里面的控件也跟include一样,你可以先初始化ViewStub中的布局中再初始化控件: //1、初始化被inflate的布局后再初始化其中的控件,...id没有冲突,可以直接初始化控件使用: //2、直接初始化控件 Switch sw = findViewById(R.id.sw);
2、ViewStub类结构图 ? 从这个图里面我们可以发现ViewStub是一个控件。...是控件那就好办了,那么对其它控件可以进行的操作(例如:初始化,创建对象使用) 它都可以进行。 ...ViewStub是一个控件,所以属性都是android下的,包括layout 所以我们可以实现用一个button控制ViewStub的动态加载。 3、ViewStub属性方法 ? ...推荐的做法是使用Android.view.ViewStub,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。...可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub
ViewStub 在一个页面上根据不同条件展示不同的控件,我们常常会设置控件的可视属性,比如调用指定控件的setVisibility方法,若需展示则设置View.VISIBLE,若需隐藏则设置View.GONE...不过gone的控件只是看不到罢了,实际UI渲染时还是会被加载。要想事先不加载,在条件符合时才加载,就得用到标签ViewStub。...ViewStub类似一个简单的View,但具体布局由属性layout指定,并且在app加载UI时,ViewStub不显示界面内容,只有在代码中调用该控件的inflate方法,layout指定的布局才会展示...基于以上特性,ViewStub在提高布局性能上有几个特点: 优点:ViewStub在加载时只占用大约一个View控件的内存,不占用layout整个布局需要的内存; 缺点:ViewStub一旦调用inflate...: style="@style/middle_text_center" 主题Theme 主题是一种特殊的样式,主题专用于页面,而样式一般运用于控件。
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方法加载视图,该方法会返回视图根节点。
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...);//获取到的textview是空的; 而使用textView = findViewById(R.id.hello_tv);就可以直接拿到控件对象了; 当实现引用布局的显示和隐藏时,测试发现使用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目前有个缺陷就是还不支持 标签。
注意事项 使用include最常见的问题就是findViewById查找不到目标控件,这个问题出现的前提是在include时设置了id,而在findViewById时却用了被include进来的布局的根元素...此时如果通过findViewById来找my_title_parent_id这个控件,然后再查找my_title_parent_id下的子控件则会抛出空指针。...将根view添加到父控件中 2.ViewStub 其实ViewStub就是一个宽高都为0的一个View,它默认是不可见的,只有通过调用setVisibility函数或者Inflate函数才会将其要装载的目标布局给加载出来...setContentView(R.layout.main); // 方式1,获取ViewStub, ViewStub listStub =...viewstub自己移除,将最终渲染的控件插入会对应的index 注意事项 判断是否已经加载过, 如果通过setVisibility来加载,那么通过判断可见性即可;如果通过inflate()来加载是不可以通过判断可见性来处理的
单击某一个控件,会在Tree Overview窗口中显示出对应的控件。 根据上面讲到的Hierarchy Viewer的4个四个子窗口,我们可以很容易的查看我们布局控件的层级关系。...使用ViewStub来提高加载速度 一个很常见的开发场景就是我们想要一个布局时,并不是所有的控件都需要显示出来,而是显示出一部分,对于这种情况,我们一般采用的方法就是使用View的GONE和INVISIBLE...在使用ViewStub时需要主要以下问题: ViewStub只能加载一次,加载后ViewStub对象会被置为空,这样当ViewStub引用的布局被加载后,就不能用ViewStub来控制引用的布局了。...因此,如果一个控件需要不断的显示和隐藏,还是要使用View的Visibility属性。 ViewStub不能嵌套Merge标签。...产生这一原因主要有两个原因: 在XML布局中,控件有重叠且都有设置背景。 View的OnDraw中同一区域绘制多次。
领取专属 10元无门槛券
手把手带您无忧上云