在书上了解了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为空。