android ViewStub延时渲染的应用

android开发当中,我们经常会遇到根据某个条件去控制一个控件的显示/隐藏的情况。虽然setVisibility(int visibility)的确可以达到这样的目的,但是在渲染时,其实隐藏的布局也会执行inflate()方法,造成额外的资源开支(内存),针对这种情况更好的做法就是使用ViewStub这个对象。

根据官网上的描述,ViewStub是一个不可见的(invisible),不占任何空间(zero-sized)的可以用来延时渲染的View对象。我们在布局中可以给他设定layout参数,指定想要替换的布局文件。当我们调用ViewStub的inflate() 或者 setVisibility()方法时,ViewStub将被指定的layout所替代,并且新的view将继承该ViewStub的布局参数。

简单的示例:

<ViewStub android:id="@+id/stub"
               android:inflatedId="@+id/subTree"
               android:layout="@layout/mySubTree"
               android:layout_width="120dip"
               android:layout_height="40dip" />

布局中,mySubTree就是我们想要延时渲染的视图。在我们调用inflate()方法后,新渲染的视图会继承ViewStub的布局参数,即,mySubTree这个布局的实际宽高将分别是120dp和40dp。新渲染的视图id将是我们指定的 subTree(对应上面布局中的inflatedId="@+id/subTree")


实际上也没必要再去调用findViewById(int),官方推荐的做法是

 ViewStub stub = (ViewStub) findViewById(R.id.stub);
 View inflated = stub.inflate();

inflated就是我们新生成的视图对象。

我们也可以通过setInlfateListener(ViewStub.onInflateListener listener)绑定监听器, 在渲染完成时通过回调对该view进行一些操作。(比如显示指定数据?)

  

时间: 2024-07-31 14:32:27

android ViewStub延时渲染的应用的相关文章

Android处理延时加载的方法

在项目开发中,经常需要通过延时加载来实现满足我们的项目要求.那到底怎样来实现延时,下面结合java与android的相关方法来实现延时问题. 一.利用线程的Sleep方法 <span style="font-family:Microsoft YaHei;font-size:18px;"><span style="white-space:pre"> </span>new Thread(new Runnable(){ @Overrid

android的shader渲染器

android里边的渲染器的使用主要是shader的子类,shader继承自object,他的子类有: 1.BitMapShader:BitMapShader 是bitmap渲染器,看名字就知道, BitmapShader是Shader的子类,可以通过Paint.setShader(Shader shader)进行设置. 这里我们只关注BitmapShader,构造方法: mBitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileM

Android 中延时执行的几种方法

延时执行的方法主要有: 1.开启新线程:2.利用定时器:3.消息处理:4.利用AlarmManager 一.开启新线程 new Thread(new Runnable(){ public void run(){ Thread.sleep(XXXX); handler.sendMessage(); //告诉主线程执行任务 } }).start 二.利用定时器 TimerTask task = new TimerTask(){ public void run(){ //execute the tas

Android ViewStub 布局延迟加载

ViewStub本身只占一点内存空间 在调用inflate后  才加载layout属性所指向的layout, 以替换当前ViewStub所占的位置 在某些 需要选择显示何种布局时,就可以使用ViewStub来延迟加载 注意:inflate只能有一次 layout: activity_view_stub.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:lay

Android ViewStub的用法

大家写项目的时候肯定会有一些东西提前写好,但是不到一定条件是不想让它显示出来的,我们可能的做法就是让它View.GONE 或View.INVISIBLE等到一定条件了在代码里面这设置View.VISIBLE 虽然这样写起来也挺方便的,也符合逻辑,但是这个条件是八百年都不出一次,你这么写就有点大才小用了,因为你事先布局好的Inflate,也就是说也就是说仍然会创建对象,会被实例化,会被设置属性.也就是说,会耗费内存等资源. 推荐的做法是使用android.view.ViewStub,ViewStu

android viewStub

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha 开发应用的时候,需要根据条件决定显示某个视图, 这个时候可以用ViewStub Stub 是  存根:烟蒂:树桩:断株  的意思. 只有 视图存根 被设置为可见的时候, 才会将 它所指向的布局 实例化. 视图存根 只能 填充inflate一次.  如果需要不止一次显示隐藏某个布局,视图存根不能实现,可以用view的可见性 实现. inflate 是 充气,膨胀的意思.

android View未渲染时获得高度

ViewTreeObserver vto = tv.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { public void onGlobalLayout() { heigh = appDescription.getHeight(); tv.getViewTreeObserver().removeGlobalOnLayoutListener(this); } });

我的Android进阶之旅------&gt;Android中的布局优化 include、merge 、ViewStub

1.如何重用布局文件? 可以使用<include>标签引用其他的布局文件,并用android:id属性覆盖被引用布局文件中顶层节点的android:id属性值.代码如下: <!--引用mylayout.xml--> <include android:id="@+id/layout1" layout="@layout/mylayout"/> 2.减少视图层级<merge /> 无论布局文件的根节点是什么,系统都会在上一层

[转]Android Shape渲染的使用(经典,学习研究不后悔)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://mzh3344258.blog.51cto.com/1823534/1215749 感觉好久都没有写博文了,感觉自己变懒了,真对不起…-_-…   也有部分原因是因为我想写的东 西网上已经有了,再加上还有很多方面小马我也正在学习,所以….这段时间一直暂停更新我的博客文 章,看到博客的访问量一天天的增加,很开心 ...O_O...这一阵子也看了各种各样的书籍,技 术类的.非技术类的