是Android开发中与视图相关的两个概念。
ViewStub的分类:
ViewStub的优势:
ViewStub的应用场景:
推荐的腾讯云相关产品和产品介绍链接地址:
View.GONE的特点:
View.GONE的应用场景:
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()
那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。...虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。 ...可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub...想要控制显示与隐藏的是一个布局文件,而非某个View。 因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。 ...所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。
* * 当被初始化的View添加到ViewStub的父布局时会使用ViewStub的布局属性,因此你可以使用ViewStub的inflatedId属性定义/重写View的id。...在初始化布局subTree之后,这个ViewStub就会从它父布局中移除。...ref android.R.styleable#ViewStub_layout */ @RemoteView public final class ViewStub extends View {...int heightMeasureSpec) { setMeasuredDimension(0, 0); } /** * 不做任何绘制,所以比普通view节省了时间与内存...* * * @see android.view.ViewStub#setOnInflateListener(android.view.ViewStub.OnInflateListener) */
在项目中,难免会遇到这种需求,在程序运行时需要动态根据条件来决定显示哪个View或某个布局,最通常的想法就是把需要动态显示的View都先写在布局中,然后把它们的可见性设为View.GONE,最后在代码中通过控制...但是它的缺点就是,耗费资源,虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。...使用时可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时或调用了ViewStub.inflate()的时候,ViewStub...4.3中所讲到的ViewStub指向的布局文件解析inflate并替换掉当前ViewStub本身,并不是完全意义上的替换(与include标签不太一样),替换时,布局文件的layout params是以..., Toast.LENGTH_SHORT).show(); } }); } else { mViewStub.setVisibility(View.GONE
那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。...虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。...可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub...想要控制显示与隐藏的是一个布局文件,而非某个View。 因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。...所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。
虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。...可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候, 或是调用了ViewStub.inflate()的时候,ViewStub...但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。...(1.)android.view.ViewStub特点: 1.ViewStub只能Inflate一次,之后ViewStub对象会被置为空。...2.想要控制显示与隐藏的是一个布局文件,而非某个View。 因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。
那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。...虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。...想要控制显示与隐藏的是一个布局文件,而非某个View。 因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。...所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。...5.3中所讲到的ViewStub指向的布局文件解析inflate并替换掉当前 ViewStub本身,并不是完全意义上的替换(与include标签还不太一样),替换时,布局文件的layout params
-------->"+viewStub); textView = viewStub.findViewById(R.id.hello_tv);//获取到的textview是空的;...; } } public void hide(View view){ viewStub.setVisibility(View.GONE); //...= null){ // constraintLayout.setVisibility(View.GONE); // } } public void show...我们用layout inspector来查看一下: inflate前:可以看到viewstub是灰色的 inflate后:可以看到viewstub直接被移除了,把引用布局直接放到view树里了。...的setVisibility()为什么也可以;跟进源码看看: 源码中使用mInflatedViewRef获取到view,然后设置隐藏与显示;mInflatedViewRef是一个view的弱引用WeakReference
ViewStub经常用在ListView中,用来隐藏一些操作,使用起来也很简单,主要就是在ListView的Item中通过一个ViewStub来引用被隐藏的布局文件。...else { viewHolder = (ViewHolder) convertView.getTag(); viewHolder.vsOperations.setVisibility(View.GONE...View v) { // TODO Auto-generated method stub if (viewHolder.vsOperations.getVisibility() == View.GONE...) { if(viewHolder.vsOperations instanceof ViewStub){ //关键!...(View.VISIBLE); } else { viewHolder.vsOperations.setVisibility(View.GONE); } }
今天写一下 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
与include标签不同,ViewStub的android:id属性是设置ViewStub本身id的,而不是重写布局id,这一点可不要搞错了。...(); break; case R.id.btn_hide: viewStub.setVisibility(View.GONE...在显示ViewStub中的布局时,你可能会采取如下的写法: if (viewStub.getVisibility() == View.GONE){...(View.GONE); } 恭喜你,踩到一个大坑了。...奇怪,我们明明写了viewStub.setVisibility(View.GONE),layout_view_stub也隐藏了,为什么ViewStub的状态还是可见呢?
GuideLine是ConstraintLayout布局的辅助对象,仅用于布局定位使用,它被标记了View.GONE,并不会显示在设备上。...是这句super.setVisibility(View.GONE)设置的默认值,不显示还是因为draw方法为空,跟上面的Space同出一辙。...ViewStub ViewStub是一个轻量级的条件视图组件。在做类似页面秒开这类性能优化时,是比较常见的延迟加载手段。 轻量级是因为ViewStub跟Space一样draw方法为空。...当我们明确知道需要显示哪个view的时候,通过ViewStub把实际视图inflate进来,这样就避免了资源浪费。...只有调用了ViewStub.inflate()的时候布局才会加载,才会创建对象实例化。
如何实现的步骤 1).先看看状态管理器类【builder建造者模式】 loadingLayoutResId和contentLayoutResId代表等待加载和显示内容的xml文件 几种异常状态要用ViewStub...,因为在界面状态切换中loading和内容View都是一直需要加载显示的,但是其他的3个只有在没数据或者网络异常的情况下才会加载显示,所以用ViewStub来加载他们可以提高性能。...; final ViewStub emptyDataVs; final int emptyDataRetryViewId; final ViewStub errorVs; final int errorRetryViewId...{ private Context context; private int loadingLayoutResId; private int contentLayoutResId; private ViewStub...= View.GONE) { valueView.setVisibility(View.GONE); if(mStatusLayoutManager.onShowHideViewListener !
break; case 2: view.setVisibility(View.GONE...二、ViewStub 我们先看看官方的说明: ViewStub is a lightweight view with no dimension and doesn’t draw anything or...setContentView(R.layout.main); // 方式1,获取ViewStub, ViewStub listStub = (...我们先看ViewStub的部分代码吧: @SuppressWarnings({ "UnusedDeclaration"}) public ViewStub(Context...setContentView(R.layout.main); // 方式二 ViewStub listStub2 = (ViewStub) findViewById
目录介绍 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中。
相信大家经常听到include、merge、ViewStub这样的标签,官方也提到这三种布局可用于布局的优化。今天就介绍下这三种布局的使用,记录下来,便于后续app中的使用。...ViewStub按需加载 按需加载 顾名思义需要的时候再去加载,不需要的时候可以不用加载,节约内存使用。...比如app中页面里某个布局只需要在特定的情况下才显示,其余情况下可以不用加载显示,这时候可以使用ViewStub。 layout属性是需要加载布局 <?...ViewStub的inflate()方法只能被调用一次,一旦调用后,ViewStub将从视图中移除,被对应的layout布局取代,同时会保留ViewStub上设置的属性效果。...ViewStub viewstub = findViewById(R.id.viewstub); viewstub.inflate(); 这篇关于include、merge、ViewStub的使用就介绍到这里了
ViewStub 在一个页面上根据不同条件展示不同的控件,我们常常会设置控件的可视属性,比如调用指定控件的setVisibility方法,若需展示则设置View.VISIBLE,若需隐藏则设置View.GONE...ViewStub类似一个简单的View,但具体布局由属性layout指定,并且在app加载UI时,ViewStub不显示界面内容,只有在代码中调用该控件的inflate方法,layout指定的布局才会展示...基于以上特性,ViewStub在提高布局性能上有几个特点: 优点:ViewStub在加载时只占用大约一个View控件的内存,不占用layout整个布局需要的内存; 缺点:ViewStub一旦调用inflate...下面是个布局中添加主题的例子: android:theme="@android:style/Theme.Dialog" 除了系统自带的主题样式,我们也可以在themes.xml中自定义主题,具体步骤与自定义样式类似...从截图可以看到,windowFrame的覆盖区域包括窗口与边框,且窗口对内半透明、对外不透明,而边框对外半透明。
领取专属 10元无门槛券
手把手带您无忧上云