packagecom.example.android_viewstub;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.view.ViewStub;importandroid.widget.Button;importandroid.widget.RatingBar;/*** Demo描述: 利用ViewStub显示和隐藏布局 ViewStub的引入: 在开发的时候,有些布局是要根据条件而动态显示,达到一个布局两用的效果,
* 运用View.VISIBLE和View.GONE去改变布局的可见性. 这样的做法显然是没什么多大的问题,优点逻辑清晰,控制灵活,但缺点就是耗费资源
* 在setContentView()或者用inflate加载布局文件时无论View是否
* 被设置为View.GONE和View.VISIBLE,都会创建对象,占用一定程度上的内存,所以在考虑优化程序的时候,
* 尽量避免资源浪费,降低程序的资源占有量,提高响应速度,提升软件的用户体验
*
* 推荐的做法是使用android.view.ViewStub. ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件.
* ViewStub是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件当 ViewStub可见,或者调用
* inflate()函数时,才会加载这个布局资源文件 注意的问题: ViewStub只能用来Inflate一个布局文件,而不是某个具体的View
*
* 遇到的问题: 报错 ViewStub must have a non-null ViewGroup viewParent 原因:
* 官方文档:viewstub不能反复inflate,只能inflate一次
**/publicclassMainActivityextendsActivityimplementsOnClickListener {privateViewStub mViewStub;privateButton mShowButton;privateButton mHiddenButton;
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView();
bindView();
}privatevoidfindView() {
mViewStub=(ViewStub)this.findViewById(R.id.stub);
mShowButton=(Button)this.findViewById(R.id.button_show);
mHiddenButton=(Button)this.findViewById(R.id.button_hidden);
}privatevoidbindView() {
mShowButton.setOnClickListener(this);
mHiddenButton.setOnClickListener(this);
}
@OverridepublicbooleanonCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);returntrue;
}
@OverridepublicvoidonClick(View v) {switch(v.getId()) {caseR.id.button_show:
View inflated=mViewStub.inflate();
RatingBar ratingBar=(RatingBar) inflated
.findViewById(R.id.ratingBar);
ratingBar.setRating(4);//mViewStub.setVisibility(View.VISIBLE);break;caseR.id.button_hidden:
mViewStub.setVisibility(View.GONE);break;default:break;
}
}
}