ViewStub的實戰開發
一.常見的布局分析
在開發的時候,有些布局是要根據條件而動態顯示,達到一個布局兩用的效果,運用View.VISIBLE和View.GONE去改變布局的可見性,
這樣的做法顯然是沒什麼多大的問題,優點邏輯清晰,控製靈活,但缺點就是耗費資源,在setContentView()或者用inflate加載布局文件時
,無論View是否被設置為View.GONE(隱藏)和View.VISIBLE(可見),都會創建對象,占用一點程度上的內存,所以在考慮優化程序的時候,
盡量避免資源浪費,降低程序的資源占有量,提高響應速度,提升軟件的用戶體驗。
二.ViewStub的介紹
1.其實Google在android1.0發布的時候,就提供了android.view.ViewStub類,繼承於android.view.View,
是一個輕量級的View,不占用布局的位置(相對於View設置了View.GONE效果),占用資源小,性能尤佳等特點;
2.使用ViewStub兩個屬性:
1)android:inflatedId :重新定義引用布局文件根元素Id,運用inflateId要注意兩點:
a.可以不用設置;
b.在ViewStub設置inflatedId,無論引用布局文件的根元素Id是否設置,都將被inflateId所代替,
那麼布局文件本身的Id會重置,即沒有了,如果被實例化使用,將會報空指針異常:
java.lang.NullPointerException;
2)android:layout:引用布局文件,需獨立的layout文件,類似include的layout屬性,這個屬性必須要設置否則報錯:
java.lang.IllegalArgumentException: ViewStub must have a valid layoutResource
3.ViewStub的使用
ViewStub有個特點,它隻能被inflate一次,之後會被置空,如果再次使用inflate時,則會報空指針異常,
所以ViewStub也不是萬能的,如果是經常要來回切換ViewStub的顯示和隱藏,ViewStub就不適用,但有個辦法
可以控製引用布局裏的View的可見性,在一定程度上,可以控製可見性;
三.開發實戰
1.MainActivity.java
1 /** 2 * @ClassName MainActivity 3 * @Description TODO 布局文件有兩個ViewStub,在程序onCreate時,用奇偶來決定顯示那一個ViewStub 4 * 布局-------1 和 布局-------2 5 * @author kenny 6 * @date 2012-8-18 7 */ 8 public class MainActivity extends Activity { 9 10 @Override 11 public void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_main); 14 15 ViewStub viewStub; 16 if (((int) (Math.random() * 100)) % 2 == 0) { 17 viewStub = (ViewStub) findViewById(R.id.viewstub_demo_text); 18 viewStub.setVisibility(View.VISIBLE); 19 20 /** 用inflate()和setVisibility()效果一樣 */ 21 //viewStub.inflate(); 22 } else { 23 viewStub = (ViewStub) findViewById(R.id.viewstub_demo_image); 24 viewStub.setVisibility(View.VISIBLE); 25 } 26 } 27 }
2.activity_main.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:gravity="center_horizontal" 6 android:orientation="vertical" > 7 8 <ViewStub 9 android:id="@+id/viewstub_demo_text" 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:layout_marginLeft="5dip" 13 android:layout_marginRight="5dip" 14 android:layout_marginTop="10dip" 15 android:layout="@layout/viewstub_demo_textview01" /> 16 17 <ViewStub 18 android:id="@+id/viewstub_demo_image" 19 android:layout_width="wrap_content" 20 android:layout_height="wrap_content" 21 android:layout_marginLeft="5dip" 22 android:layout_marginRight="5dip" 23 android:layout="@layout/viewstub_demo_textview02" /> 24 </LinearLayout>
3.viewstub_demo_textview01.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" 5 android:orientation="vertical" > 6 7 <TextView 8 android:id="@+id/textview01" 9 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" 11 android:background="#aa664411" 12 android:textSize="16sp" 13 android:text="布局-------1" 14 /> 15 16 </LinearLayout>
4.viewstub_demo_textview02.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" 5 android:orientation="vertical" > 6 7 <TextView 8 android:id="@+id/textview02" 9 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" 11 android:background="#aa664411" 12 android:textSize="16sp" 13 android:text="布局-------2" 14 /> 15 16 </LinearLayout>
源碼下載:/Files/hpboy/ViewStub01.zip
轉載請注明出處:https://www.cnblogs.com/hpboy
最後更新:2017-04-04 07:03:48