ViewStub組件和<include>標簽的作用類似,主要是為瞭提高佈局的重用性,及佈局的模塊化。它們之間最大的差別是,ViewStub中的佈局不會隨著它所在佈局的渲染而渲染,而<include>標簽中的佈局會隨著它所在佈局的渲染而渲染,ViewStub中的佈局隻有在你需要的時候才會渲染到主界面中。
1、xml
main.xml
Java代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn"
android:text="顯示"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn2"
android:text="btn2"
/>
<ViewStub
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/vs"
android:layout="@layout/viewstub"
/>
</LinearLayout>
viewstub.xml
Java代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn3"
android:text="other btn"
/>
</LinearLayout>
2、MainActivity.java
Java代碼
package com.lp.viewStub;
import android.app.Activity;
import android.opengl.Visibility;
import android.os.Bundle;
import android.view.View;
import android.view.ViewStub;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button btn;
private Button btn2;
private ViewStub vs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
vs = (ViewStub)findViewById(R.id.vs);
btn = (Button)findViewById(R.id.btn);
btn2 = (Button)findViewById(R.id.btn2);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//vs.inflate();//多次點擊出錯
vs.setVisibility(View.VISIBLE);
}
});
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
vs.setVisibility(View.GONE);
}
});
}
}
這樣既可以用瞭
另外 我在寫的時候 的幾個問題
1、多次調用inflate()錯誤
當你掉 mViewStub.inflate()的時候 已經用你viewStub裡面指定的layout替代瞭ViewStub ,換句話說 ViewStub已經不在main.xml裡面 在inflate()源碼裡面 會判斷
Java代碼
final ViewParent viewParent = getParent();
if (viewParent != null && viewParent instanceof ViewGroup) {
這時候 getParent()就是null瞭 所以你再一次點擊 就會報錯瞭
2、調用vs.setVisibility(View.VISIBLE);可以多次點擊
在源碼當中
Java代碼
super.setVisibility(visibility);
inflate();
先不顯示 然後才調用Inflate() 所以ViewStub可能還在main.xml裡面吧 所以getParent不會報錯
作者“TryLoveCatch”