ViewStub惰加载控件和include

 

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>

 

 

 

你可能感兴趣的:(ViewStub)