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为空。

  

原文地址:https://www.cnblogs.com/caoRM/p/4649792.html