ViewStub:
ViewStub是一个看不见,不占用控件的View,在布局中只起到一个占位符的作用,也就是说当应用程序加载布局的时候,它不会消耗任何内存与资源。你可以把一些不常用的布局放在ViewStub中,仅需要的时候再进行显示。以此来达到性能优化的作用。
将只需要特定时候显示的布局标记在ViewStub中。当需要显示这些View的时候可以调用ViewStub的inflate或者setVisibiliy()来显示它们。其他情况它们根本不占用内存。
ViewStub的局限性:
因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。这时就只能使用View的可见性来控制了。
Demo:
主布局:
<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:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"/>
<ViewStub
android:id="@+id/viewstub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout="@layout/viewstub_ui"
/>
</LinearLayout>
特定情况下显示的布局:
<?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:gravity="center"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Visiable1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Visiable2"/>
</LinearLayout>
package com.example.viewstub;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewStub;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
private Button button;
private ViewStub viewStub;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
}
private void initEvent() {
// TODO Auto-generated method stub
button.setOnClickListener(this);
}
private void initView() {
// TODO Auto-generated method stub
button = (Button)findViewById(R.id.btn1);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int arg = v.getId();
switch (arg) {
case R.id.btn1:
viewStub = (ViewStub)findViewById(R.id.viewstub);
if(viewStub != null){
viewStub.setVisibility(View.VISIBLE);
}
break;
default:
break;
}
}
}
注意在OnClick中对viewStub进行了非空判断,因为上面所提到的其局限性,ViewStub只能填充(inflate/setVisibiliy)一次布局,填充后这个引用就会被置为空。如果不进行判断,会引发空指针的问题。这里大家需要注意下