ViewStub的使用

    ViewStub是一个不可见的、大小为0的控件,运行时ViewStub能够滞后加载。当ViewStub置为可见或者调用inflate()的时候,布局就会加载出来。用加载进来的布局取代ViewStub在父布局中的位置。所以,ViewStub只有在调用了setVisibility()或者inflate()以后,才会在层级中显示出来。将ViewStub布局参数设置给ViewStub指定加载的布局。同理,你能够用ViewStub的inflatedId定义或者覆盖ViewStub指定加载的布局id,例如:html

<ViewStub 
  android:id="@+id/stub" android:inflatedId="@+id/subTree" --简单的说就是能够在此处指定布局文件mySubTree的根id android:layout="@layout/mySubTree" android:layout_width="120dip" android:layout_height="40dip" />

    所以,咱们能够经过id “stub”找到ViewStub这个控件,布局资源mySubTree加载完以后,ViewStub就会从它的父布局中移除。咱们能够经过“subTree”这个id找到这个由布局资源mySubTree建立的view,经过inflatedId这个属性找到这个view。加载进来的新布局被指定宽为120dp,高为40dp。这种加载布局资源的方式以下所示:java

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

    当调用inflate方法的时候,加载的布局将取代ViewStub,而且返回这个view的位置。这种方法可让应用在不执行findViewById这个方法就能够获得布局的引用。以上翻译自官网:https://developer.android.com/reference/android/view/ViewStub.htmlandroid

    说了这么多到底怎么使用ViewStub这个控件那???首先咱们先说一下使用场景:根据某种状态,判断识别并显示某种布局。简单点说,就是A状态下,显示a布局,B状态下,显示b布局。布局

这种场景你们确定都遇到过,而且频繁的改变AB状态,就能够频繁的改变ab布局的显示与隐藏。咱们以前的方法是将全部控件全都添加到布局上,而后暂时用不到的隐藏掉,须要的时候在显示出来。可是这种作法是极其耗资源的,在加载布局的时候,即便你将暂时不用的控件隐藏掉,但仍是会加载进来的,从而耗费了资源。这种时候,官网推荐使用的ViewStub这个控件。spa

    ViewStub的优势:它是一个轻量级的View,是一个看不见的,不占布局位置,占用资源很是小的控件。咱们能够在ViewStub下指定要加载的布局并指定布局id,当咱们须要该布局显示的时候,只须要调用ViewStub的inflate()便可。或者setVisibility();.net

    ViewStub的缺点:ViewStub的inflate()只能调用一次,屡次调用会有异常抛出。也就是说咱们只能对ViewStub加载的布局控制一次,若想屡次控制该布局,须要使用View的可见性来控制。可是ViewStub的setVisibility()和View的可见性达到的效果是同样的,而且setVisibility()能够屡次调用。翻译

    最后我在重申一遍ViewStub的使用背景,对view的显示只有一次控制的时候,ViewStub是最好的选择,节省资源。若想屡次调用,用View的可见性来实现,用ViewStub的setVisibility()也行。本篇文章参考自http://blog.csdn.net/hitlion2008/article/details/6737537htm

相关文章
相关标签/搜索