2011.09.22——— android ViewStub的简单使用

人走丿茶凉 2011-09-22

2011.09.22———androidViewStub的简单使用

参考:http://www.cnblogs.com/xirihanlin/archive/2010/04/28/1723291.html

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=100417&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline

ViewStub组件和<include>标签的作用类似,主要是为了提高布局的重用性,及布局的模块化。它们之间最大的差别是,ViewStub中的布局不会随着它所在布局的渲染而渲染,而<include>标签中的布局会随着它所在布局的渲染而渲染,ViewStub中的布局只有在你需要的时候才会渲染到主界面中。

1、xml

main.xml

<?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

<?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

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()源码里面会判断

final ViewParent viewParent = getParent();

        if (viewParent != null && viewParent instanceof ViewGroup) {

这时候getParent()就是null了所以你再一次点击就会报错了

2、调用vs.setVisibility(View.VISIBLE);可以多次点击

在源码当中

super.setVisibility(visibility);
            inflate();

先不显示然后才调用Inflate()所以ViewStub可能还在main.xml里面吧所以getParent不会报错

相关推荐