Design庫-SnackBar屬性詳解
序
SnackBar,中文名稱:快餐店(本Android狗常去地點之一)
Toast,中文名稱:吐司
從名字上看,SnackBar就高階一點(純屬瞎聊),有的人認為SnackBar會取代Toast,Toast漸漸淪為了程式設計師測試的“工具”,
畢竟從直觀上SnackBar顏值確實好很多。但是我覺得兩者各有所長吧。這篇文章主要介紹SnackBar的基礎使用,以及和Toast的一些對比。
1.SnackBar的特性
先從原始碼的註釋來了解下:
Snackbars provide lightweight feedback about an operation. They show a brief message at thebottom of the screen on mobile and lower left on larger devices. Snackbars appear above all other elements on screen and only one can be displayed at a time.
簡譯:SnackBars提供了一個輕量級的反饋操作。他們在螢幕的底部顯示一條簡短的資訊,如果是較大的裝置就顯示在左下角。SnackBar出現在螢幕中所有其他元素的上方,同一時間僅僅只有一條SnackBar。
從上面這句話我們可以知道:
1.SnackBar和Toast的用途一樣,都是用來提示使用者操作後的結果的。
2.SnackBar顯示時位置一般是在螢幕底部,較大的裝置就顯示在左下角。
3.SnackBar同一時間只有一條
They automatically disappear after a timeout or after user interaction elsewhere on the screen,
particularly after interactions that summon a new surface or activity. Snackbars can be swipedoff screen.
簡譯:在超時或者使用者在螢幕上完成了互動的時候SnackBar會自動消失,特別是在召喚了新的表層(意思是SnackBar本來是最外層的,然後在SnackBar上又新添加了一層)或者Activity的時候。SnackBar能在螢幕上側滑。
從上面這句話我們可以知道:
1.SnackBar可以自動消失,也可以手動取消(在完成某個操作的時候)
2.在Activity結束的時候,SnackBar會消失,這點Toast不會
3.SncakBar能支援側滑,側滑幹嘛呢?當然是刪除,之後會做介紹
Snackbars can contain an action which is set via {@link#setAction(CharSequence, android.view.View.OnClickListener)}.
簡譯:SnackBar能包含一個action使用setAction方法
To be notified when a snackbar has been shown or dismissed, you can provide a {@linkCallback} via {@link#setCallback(Callback)}
簡譯:你可以用CallBack來得知Snackbar是顯示還是隱藏
2.Sncakbar的簡單使用
看了那麼文字是不是很無趣?別急接下來先看看效果:
實現很簡單就是在一個Button的單擊事件中,顯示一個SnackBar,關鍵程式碼:
Snackbar.make(btnShowSnackBar,"歡迎來到Android快餐店",Snackbar.LENGTH_SHORT).show();
這貨的使用方式和Toast幾乎一毛一樣,唯一的不同就是第一個引數。
第一個引數:傳入一個View物件
第二個引數:傳入一段字元
第三個引數:顯示的時長
最後通過show()方法來展示。
3.SnackBar的顯示位置
那麼現在問題來了,明明我給的是一個Button,他不在Button上顯示,為何跑螢幕下方去了呢?
這時候就要去原始碼看看它是怎麼實現的:
首先在make()方法中找到這樣一句話:
Snackbarsnackbar =newSnackbar(findSuitableParent(view));
這句話告訴我們,我們傳入的view經過了findSuitableParent()方法的包裝。
這裡就不貼該方法的原始碼了,這個方法主要的作用是:
1.當傳入的View不為空時,如果我們在佈局中發現了CoordinatorLayout佈局,那麼View就是CoordinatorLayout;
2.如果沒有CoordinatorLayout佈局,我們就先找到一個id為android.R.id.content的FrameLayout(這個佈局是最底層的根佈局),將View設定為該FrameLayout;
3.其他情況下就使用View的Parent佈局一直到這個View不為空。
這樣我們就可以解釋清楚SnackBar的顯示位置是如何確定的了。
口說無憑我們來驗證下:
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="300dp">
<Button
android:id="@+id/btnShowSnackBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/activity_horizontal_margin"
android:text="顯示SnackBar"/>
</android.support.design.widget.CoordinatorLayout>
僅僅就是在Button外包裹了一層CoordinatorLayout(繼承於FrameLayout)。然而效果變成了:
很明顯可以看到顯示的位置變了,這也驗證了我們的想法。
4.Snackbar的顯示時常
有三種狀態:
Snackbar.LENGTH_SHORT// 短時間顯示,然後自動取消
Snackbar.LENGTH_LONG// 長時間顯示,然後自動取消
Snackbar.LENGTH_INDEFINITE// 不消失顯示,除非手動取消
這時候我的強迫症犯了,想知道具體的時間,記得有個CallBack方法,接下來就來試試.
5.SnackBar的callBack方法
在SnackBar的回撥方法callBack中的onShow()和onDismissed()方法中,記錄下當前的系統時間,然後比較差值,得出顯示的時長。
核心程式碼如下:
Snackbar.make(btnShowSnackBar,"歡迎來到Android快餐店",Snackbar.LENGTH_SHORT).setCallback(newSnackbar.Callback() {
@Override
public void onShown(Snackbar snackbar) {
super.onShown(snackbar);
showTime=System.currentTimeMillis();//顯示的時間
}
@Override
public voidonDismissed(Snackbar snackbar,int event) {
super.onDismissed(snackbar, event);
dismissTime=System.currentTimeMillis();//消失的時間
tvTime.setText(""+(dismissTime-showTime));//用一個TextView顯示時間的差值
}
}).show();
測試結果:
Snackbar.LENGTH_SHORT:1777左右,意思就是1.8s的樣子
Snackbar.LENGTH_LONG:3031-3034, 大概就是3s的樣子
上面我們知道了callBack中有個onshow()和onDismissed()兩個重要的方法,一個是顯示的時候呼叫,一個是消失的時候呼叫,這都很容易理解,下面詳細說下onDismissed()中的event事件有哪些:
1.滑動消失的時候呼叫
/** Indicates that the Snackbar was dismissed via a swipe.*/
public static final int DISMISS_EVENT_SWIPE=0;
2.點選Action消失的時候呼叫
/** Indicates that the Snackbar was dismissed via an action click.*/
public static final intDISMISS_EVENT_ACTION=1;
3.超時消失的時候呼叫
/** Indicates that the Snackbar was dismissed via a timeout.*/
public static final intDISMISS_EVENT_TIMEOUT=2;
4.手動呼叫dismiss()方法時呼叫
/** Indicates that the Snackbar was dismissed via a call to {@link#dismiss()}.*/
public static final intDISMISS_EVENT_MANUAL=3;
5.一個新的SnackBar出現的時候呼叫
/** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/
public static final intDISMISS_EVENT_CONSECUTIVE=4;
使用也很簡單:
if(event==DISMISS_EVENT_SWIPE){
//滑動消失後的邏輯
}
6.給SnackBar新增Action事件
先看看效果:
Snackbar.make(btnShowSnackBar,"歡迎來到Android快餐店",Snackbar.LENGTH_LONG).setAction("點餐",newView.OnClickListener() {
@Override
public void onClick(View v) {
tvTime.setText("點餐成功");
}
}).show();
使用起來很簡單,感覺就是一個Button。
第一個引數是一段字串
第二個引數是一個onClickListener()介面
7.修改SnackBar顏色
我們知道不同的APP有不同的主題,如果我們字型的顏色和背影一直是這個樣式,難免有點不搭。
在它自帶的方法中我們找到了這個:setActionTextColor(Color.YELLOW) .使用之後效果如下。
-。- 然後我就找不到其他方法了,這時候怎麼辦?這是之前看到的一篇文章,寫得很不錯,裡面的“花式SnackBar”相信可以滿足你的需求
8.其他系統自帶方法
1.設定顯示文字的內容,如果在make方法之後設定,會覆蓋make方法中的文字
setText(int resId|CharSequencemessage)
2.設定顯示的時長,只能3選一
setDuration(int duration)
3.設定SnackBar手動消失
dismiss()
4.設定SnackBar顯示
show()