ViewStub

在书上了解了ViewStub,但只是带过两笔,没能了解。在网上搜索了一些资料,虽然很多文章都讲得比较完善,但是觉得可能是表达的原因,导致某个点上我理解错误,慢慢的才算比较清楚的认识ViewStub。

首先ViewStub的特点,是属于性能优化的控件。ViewStub占用内存少,真真实实的存在于布局文件中,但是ViewStub所占用的内存很少很少。并且ViewStub可以存放一个布局“xml”,当你在必要的时候可以将布局填充到屏幕中。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context=".ViewStubActivity">

    <ToggleButton
    android:id="@+id/ViewStubButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textOff="ShowViewStub"
    android:textOn="Close"
    />

    <ViewStub
        android:id="@+id/ViewStub"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout="@layout/showimageview"
        />
</RelativeLayout>

看看上面的布局文件,注意ViewStub,其中一个重要的属性就是"android:layout="作用是指定一个需要填充的布局。而这个布局它会替换掉ViewStub,但是ViewStub的width、heigh属性会替换掉这个布局的相应属性。替换掉(inflat)后,ViewStub就相当于消失了。

下面通过所有代码来看看:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:background="@android:drawable/btn_dialog"
           android:id="@+id/imageview">

</ImageView>
public class ViewStubActivity extends ActionBarActivity {
    private ToggleButton mViewStubButton;
    private View nNoDataView ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_stub);
        mViewStubButton= (ToggleButton) findViewById(R.id.ViewStubButton);
        mViewStubButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    if(nNoDataView==null) {//这个判断很重要,保证ViewStub不被inflate()两次
                        ViewStub  mViewStub= (ViewStub) findViewById(R.id.ViewStub);
                        nNoDataView=mViewStub.inflate();//通过inflate()填充布局
                        ImageView imageview= (ImageView)nNoDataView.findViewById(R.id.imageview);
                    }
                    else{
                        nNoDataView.setVisibility(View.VISIBLE);
                    }

                }else{
                    nNoDataView.setVisibility(View.GONE);
                }
            }
        });

    }

}

注意:1、ViewStub在一个Activity中只能被inflate()一次,否则会报错,所以使用View一定要注意好这一点。
   2、假如第一次使用ViewStub.setVisibility(View.VISIBLE)。会调用inflate();要是之后再调用inflate()会报错的。第二次使用ViewStub.setVisibility(View.VISIBLE不会再调用inflate()
   3、对ViewStub调用inflate()后,ViewStub就会被替换掉,它的id都不再存在,若再一次ViewStub mViewStub= (ViewStub) findViewById(R.id.ViewStub);这个mViewStub为空。

  

时间: 2024-10-14 02:50:41

ViewStub的相关文章

ViewStub的使用

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

学习使用ViewStub

这是官方介绍: A ViewStub is an invisible, zero-sized View that can be used to lazily inflate layout resources at runtime. When a ViewStub is made visible, or when inflate() is invoked, the layout resource is inflated. The ViewStub then replaces itself in i

Android性能优化之一:ViewStub

ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的View,与其他的控件一样,有着自己的属性及特定的方法.当ViewStub使用在布局文件中时,当程序inflate布局文件时,ViewStub本身也会被解析,且占据内存控件,但是与其他控件相比,主要区别体现在以下几点: 1.当布局文件inflate时,ViewStub控件虽然也占据内存,但是相相比于其他控

android 布局之include、merge 、ViewStub

在布局优化中,Androi的官方提到了这三种布局<include />.<merge />.<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一下他们的优势,以及怎么使用,简单复习下. 1.布局重用<include /> <include />标签能够重用布局文件,简单的使用如下: <span style="font-size:12px;"><LinearLayout xmlns:andr

Android 性能优化 三 布局优化ViewStub标签的使用

小黑与小白的故事,通过虚拟这两个人物进行一问一答的形式来共同学习ViewStub的使用 小白:Hi,小黑,ViewStub是什么?听说可以用来进行布局优化. 小黑:ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件.(更多详细的API等信息可以查看官方文档ViewStub),计算机行业一向是实践里面出真知,下面用一个例子演示下效果. 小黑:说说概念只是为了概括性的了解下,还是用个实例来演示下.先来创建一个Activity中使用的布局文件,文件名是:act

使ViewStub 来提高UI的加载的性能

首先看下API中的ViewStub 根据的文档的说明,ViewStub是一种默认不可见的试图,它没有大小,所以不能被改变,也不能通过某些把viewstub添加到布局当中来, 不过我们可以使用inflate()来吧ViewStub中的试图增加进行,这样可以实现动态的添加试图,不必要每次在onCreate()的时候就加载布局,可以提高我们的性能. Demo中的使用方法: 1:新建布局文件 设置<ViewStub>节点 2: 在Activity中进行按钮点击  viewStub = (ViewStu

Android 使用ViewStub优化布局

在Android开发的工作学习中,我们往往会遇到一个比较复杂的页面,如一件商品的详情页,如天猫商城,一件商品的价格,图文介绍,秒杀活动,商品用户评价等,而且这些数据往往不是一个接口下发的,我们常规的处理是: 先将所有的view设为Gone,当后台接口调用成功后,在callback里面设置view的属性,并设为Visiable. 所有的接口异步并行调用. 这样的处理,也没有什么大问题,不过我们还可以做的更好,即使用ViewStub. 通俗的说,ViewStub是一个轻量级的view,可以使用它代替

轻量级的惰性控件——ViewStub

在开发过程中,有时候,需要这样一种控件,正常情况下不可见,不占用任何布局空间,只在某种特定情况下显示,这种情况下,我们使用一个普通的View,利用设置setVisibility(View.GONE)自然也可以实现,但是这样的话即使我们不需要显示View,Android也会将这个View渲染出来,只不过不显示而已.如果我们不仅仅需要一个控件,而是一个layout呢?那么是不是Android将做更多的无用功呢?而ViewStub很好的避免了这个问题,默认情况下ViewStub是不显示的,不占用父控件

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

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