佈局與控件(五)-Toast吐司與佈局的抽象標簽merge include ViewStub

第5節 Toast

5.1 使用效果

Toast用來向用戶彈出一個提示框,然後自動消失,就像這樣,

面包機烤好面包後,就騰的一下把面包從面包機裡彈出來。而這個控件顯示時也像是從面包機裡彈出來的,所以取瞭這個名字-Toast(吐司)。

使用Toast顯示消息的時候,即使啟動它的Activity並沒有顯示在屏幕上,Toast提示的消息也會被顯示到最前面,讓用戶看到。例如,

Activity A正通過網絡下載一個文件, 此時用戶點擊Home回到主界面,又啟動瞭另一個應用的Activity B;現在Activity A不再顯示瞭; 下載完成後,隱藏起來的Activity A使用Toast給用戶一個提示; 雖然Activity A現在沒有顯示出來,但是它使用Toast給出的提示,還是會被顯示到整個界面的最上面,被用戶看到;

5.2 顯示原理

這是因為Toast會顯示在一個特別的窗口層次上,這個窗口比任何Activity使用的窗口層次更高,更優先的顯示到上層。

關於窗口系統具體的原理,我們會在安卓系統的窗口機制相關章節進行介紹。

5.3 使用方式

調用Toast的makeText函數生成一個Toast對象,再調用它的show函數顯示出來。makeText有三個參數,第一個是Context對象,第二個是要顯示的字符串,第三個是要顯示的時長。

第一個參數Context:是當前Activity運行的上下文環境,也就是它運行時所擁有的各種系統資源。Activity是從Context繼承而來的,所以Activity本事就是我們要找的context; 第二個參數:是要顯示的內容; 第三個參數:顯示的時間長短,它隻能設置長或短。
Toast.LENGTH_SHORT,Toast.LENGTH_LONG。

Toast.makeText(context, "需要顯示的內容", Toast.LENGTH_SHORT).show()

第6節 佈局的抽象標簽-merge include ViewStub

include標簽、merge標簽,以及ViewStub標簽是安卓佈局使用的抽象標簽。它們並不代表某個具體的佈局或者控件,而是起佈局的輔助作用,提高佈局執行的效率和易用性。

例如,對於那些會重復使用到的佈局結構,可以它們放到一個單獨的layout文件中。當我們在任何要使用這個佈局的地方,就通過復用的方法,將它包含到新的佈局文件中。

假設下面這個佈局結構會被經常的使用,我們就可以將它單獨定義到一個獨立的佈局文件reuse.xml

<framelayout android:layout_height="match_parent" android:layout_width="match_parent">

   

</framelayout>

6.1 include標簽

當別的佈局文件main_layout.xml,要使用上面被獨立出來的佈局時,就可以用標簽把這個佈局包含進來。在標簽的layout屬性中,指定要復用的佈局的id就可以瞭。

例如main_layout.xml使用標簽,



   
   

此時main_layout.xml實際上,就變成瞭,



    
   <framelayout android:layout_height="match_parent" android:layout_width="match_parent">

       

   </framelayout>
   

6.2 merge標簽

再來看看merge標簽,將reuse.xml中的FrameLayout修改成merge


          

main_layout.xml繼續使用標簽,



   
   

此時main_layout.xml實際就變成瞭,



    
   
   

與之前相比,少瞭FrameLayout一層。在佈局時少一個層次的包裹,可以增加佈局的效率。

6.3 ViewStub標簽

這是一個佈局的占位符。當一個佈局包含瞭這種標簽,它並不會加載這個標簽的內容,而是在需要的時候,通過代碼來動態加載。

例如,一個佈局main_layout.xml裡面,有一個ProgressBar,佈局被加載時,這個ProgressBar就會被創建出來,



   

          
   

如果我們將ProgressBar放到一個單獨的佈局文件progress_layout.xml當中,


然後main_layout.xml中使用ViewStub引用這個佈局,



   

          
    ---為這個ViewStub被代替之後,給代替者一個ID

佈局被加載時,這個ProgressBar並不會被創建出來。使用如下方式,就可以把ViewStub,替換成android:layout指定的佈局,

在代碼中使用setVisibility()函數,

((ViewStub) findViewById(R.id.viewstub_id)).setVisibility(View.VISIBLE);

在代碼中使用inflate()函數,

((ViewStub) findViewById(R.id.viewstub_id)).inflate();

替換之後,ViewStub就被從佈局當中移除瞭,這個佈局就變成瞭,



   

          
   

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *