閱讀303 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go tc SRM 570 div2 1000 CentaurCompanyDiv2
  下一篇:go Android中圖片的上傳和下載