1 ViewStub,惰性装载控件,可以在程序运行的过程中,通过懒加载的模式inflate(即在程序中调用inflate方法)进入布局资源中。
2 使用场景:程序初始化的时候不需要加载,在用户操作过程中根据用户需求加载(好处:加快程序初始化速度)
3 使用方法:第一次操作调用控件的inflate或setVisibility方法,控件可以显示,想要第二次显示的话只能调用 setVisibility方法
4 个人理解:与include功能相同即将另一个布局引入到当前布局中,
二者不同:include会直接加载另一个组件,但ViewStub只有调用才会加载()
例子代码:
1 Activity
public class ViewStubActivity extends Activity {
private Button btn1, btn2, btn3;
private ViewStub viewStub;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_stub);
// 获取控件,绑定事件
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn3 = (Button) findViewById(R.id.btn3);
viewStub = (ViewStub) findViewById(R.id.stub);
viewStub.setOnInflateListener(inflateListener);
btn1.setOnClickListener(click);
btn2.setOnClickListener(click);
btn3.setOnClickListener(click);
}
private OnInflateListener inflateListener = new OnInflateListener() {
@Override
public void onInflate(ViewStub stub, View inflated) {
// inflaye ViewStub的时候显示
Toast.makeText(ViewStubActivity.this, "ViewStub is loaded!",
Toast.LENGTH_SHORT).show();
}
};
private View.OnClickListener click = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
try {
// 如果没有被inflate过,使用inflate膨胀
LinearLayout layout = (LinearLayout) viewStub.inflate();
RatingBar bar = (RatingBar) layout
.findViewById(R.id.ratingBar1);
bar.setNumStars(4);
} catch (Exception e) {
// 如果使用inflate膨胀报错,就说明已经被膨胀过了,使用setVisibility方法显示
viewStub.setVisibility(View.VISIBLE);
}
break;
case R.id.btn2:
// 隐藏ViewStub
viewStub.setVisibility(View.GONE);
break;
case R.id.btn3:
// 操作被inflate的控件,需要得到当前布局的对象
// 然后通过这个对象去找到被inflate的控件。
// 因为否则在这个示例中,会找到include标签引入的控件
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.inflatedStart);
RatingBar rBar = (RatingBar) linearLayout
.findViewById(R.id.ratingBar1);
float numStart = rBar.getRating();
numStart++;
if (numStart > 4) {
numStart = 0;
}
rBar.setRating(numStart);
break;
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
2 xml布局 ,有include的使用和ViewStub控件的使用
<LinearLayout 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:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.layoutproperty.ViewStubActivity" > <!-- 使用include标签加载一个id为activity_view_stub_rat的控件 --> <include android:layout_width="wrap_content" android:layout_height="wrap_content" layout="@layout/activity_view_stub_rat" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#FFCCDD" android:orientation="vertical" > <!-- 定义一个ViewStub 给其父Layout指定Id为inflatedStart,引入activity_view_stub_rat布局动态装载 --> <ViewStub android:id="@+id/stub" android:inflatedId="@+id/inflatedStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout="@layout/activity_view_stub_rat" /> </LinearLayout> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="动态添加布局" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="动态隐藏布局" /> <Button android:id="@+id/btn3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="操作StubInflate的控件" /> </LinearLayout>
3 包含近来的布局组件 activity_view_stub_rat.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <RatingBar android:id="@+id/ratingBar1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>