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>