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