当前位置:操作系统 > 安卓/Android >>

android ViewStub的简单使用

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不会报错

作者“TryLov

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,