第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
就被從佈局當中移除瞭,這個佈局就變成瞭,