Google在2015 I/O大會上,給咱們帶來了更加詳細的Material Design規範,同時也引入了Android Design Support Library,爲咱們提供了基於Material設計規範的控件。它兼容性廣,能兼容到android 2.1(按Google官方數據,兼容android 2.3以上便可覆蓋當前市面上全部Android設備),而且高度封裝,使用簡潔,可謂業界良心之做。css
在與用戶的交互過程當中,有時咱們須要給用戶一些提示信息,甚至可能提供一些操做的選擇。一般,咱們會使用Dialog或Toast來進行這種提示。這兩種提示各有特色,但卻彷佛都在各自的特色上走了極端。
Dialog的特色是,它彈出來的時候會中斷用戶當前的操做,直到這個Dialog被處理。它除了向用戶提供一些信息以外,也可能包含一些操做,一般用於必須打斷用戶的提示,好比當用戶進行清空數據等重要操做時進行二次確認的提示。
Toast則是走了另一個極端。它用於向用戶提供少許的信息展現,而且不會中斷用戶當前的操做,這樣在與用戶的交互過程當中也不會顯得唐突。但它也只能用於展現少許信息,不能向用戶提供一些操做選擇。
而在Android Design Support Library中,谷歌爲咱們引入了Snackbar,它使用簡單,與Toast類似,而且吸取了Dialog與Toast各自的優勢,而避免了它們設計上的不足。它在界面的底部向用戶展現少許信息,而且能夠向用戶提供一種輕量級的反饋操做,以下圖:
在這個例子中,原先對於未驗證的車牌是點擊後直接跳到車牌列表的界面並提示去驗證,但顯然提示用戶未驗證並給出「去驗證」的操做建議會更加友好。java
Snackbar的使用很簡單,接口與Toast類似。像上面的圖中的例子,代碼以下:android
Snackbar.make(view, "須要驗證該車牌才能使用該功能", Snackbar.LENGTH_LONG)
.setAction("去驗證", new View.OnClickListener() {
@Override
public void onClick(View view) {
Activities.to(getActivity(), VehicleListActivity.class);
}
}).show();
Snackbar向咱們提供瞭如下相關的接口:markdown
static Snackbar make(View view, int resId, int duration)
與static Snackbar make(View view, CharSequence text, int duration)
:用於建立一個Snackbar,參數以下: view
:用於找到合適的parent的view,以把本身添加上去resId
及text
:展現的信息duration
:展現的時間,參數值以下: LENGTH_LONG
顯示2750毫秒LENGTH_SHORT
顯示1500毫秒LENGTH_INDEFINITE
一直展現,直到它被dismiss掉,或者是下一個Snackbar被顯示時。setText(int resId)
與setText(CharSequence message)
:更新Snackbar上的提示消息。setAction(int resId, View.OnClickListener listener)
與setAction(CharSequence text, View.OnClickListener listener)
:設置顯示到Snackbar上的操做。setActionTextColor(ColorStateList colors)
與setActionTextColor(int color)
:設置操做的文本顏色。setDuration(int duration)
及getDuration()
:設置及獲取顯示的時間show()
,dismiss()
及isShown()
:顯示、隱藏Snackbar,以及判斷當前Snackbar是否正在被顯示。setCallback(Snackbar.Callback callback)
:設置當前Snackbar可見性變化時的回調Snackbar提供的接口很是簡單而且易於理解,須要注意的是,與Toast不一樣,當新的Snackbar被顯示時,會先隱藏掉上一個Snackbar而後顯示新的Snackbar,而不像Toast那樣等前面的Toast顯示完畢才顯示。ide
Snackbar並無提供設置消息文本顏色的API。經過定位到它的佈局代碼,咱們能夠看到它是經過一個style來配置:佈局
android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
該style對應源碼:spa
<style name="TextAppearance.Design.Snackbar.Message" parent="android:TextAppearance"> <item name="android:textSize">@dimen/design_snackbar_text_size</item> <item name="android:textColor">?android:textColorPrimary</item> </style>
可見其顏色讀的是theme中的android:textColorPrimary
的值。可是若是咱們想要修改它的顏色的話,配置android:textColorPrimary
是無效的,咱們要配置的是theme裏面的android:textColor
。
而後可能有一個問題,一般咱們會在theme裏使用這個屬性爲整個應用配置默認的文本顏色,好比在我公司的項目裏,就使用#333
來做業默認的黑色文本,這樣就使得Snackbar的提示消息看不見(Snackbar的背景色是#ff303030
)。這種狀況下只能使用比較hack的方式來修改它的顏色值了。我試過覆蓋它的style定義,可是未能成功。最後是經過getView()
接口獲取到SnackbarLayout,再拿到裏面的TextView來修改其文本顏色,代碼以下:設計
((TextView)snackbar.getView().findViewById(android.support.design.R.id.snackbar_text)).setTextColor(Color.WHITE);
當Snackbar與CoordinatorLayout一塊兒使用時,即Snackbar顯示在CoordinatorLayout裏面時,能夠經過在Snackbar上右滑的操做把當前的Snackbar隱藏掉,即咱們在調用Snackbar.make(…)方法時,傳入的View應該爲CoordinatorLayout或CoordinatorLayout的子view。
另外Snackbar與FloatingActionButton若是都在CoordinatorLayout內時,Snackbar展現時FloatingActionButton會跟着上移,而不會出現互相遮擋的狀況。 code