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

  

你可能感兴趣的:(ViewStub)