android ViewStub的簡單使用 – Android移動開發技術文章_手機開發 Android移動開發教學課程

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”
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *