Dialog和Toast靠益,我們?cè)谌粘5拈_發(fā)中一定非常熟悉,常常被用來(lái)作為Android應(yīng)用內(nèi)提示性信息的兩種展示方式偏塞。然而Google在Design包中又提供了一種新的選擇睬魂,那就是Snackbar。今天主 要介紹Snackbar新控件的使用贞盯,以及三種提示信息展示方式的比較。
一沪饺、什么是Snackbar
Snackbar 是 Android 5.0 新特性——Material Design 中的一個(gè)控件躏敢,用來(lái)代替 Toast ,Snackbar與Toast的主要區(qū)別是:Snackbar可以滑動(dòng)退出整葡,也可以處理用戶交互(點(diǎn)擊)事件件余。
二、Snackbar的特性
Snackbar會(huì)在超時(shí)或者用戶在屏幕其他地方觸摸之后自動(dòng)消失遭居;
可以在屏幕上滑動(dòng)關(guān)閉啼器;
出現(xiàn)時(shí)不會(huì)阻礙用戶在屏幕上的輸入
屏幕上同時(shí)最多只能顯示一個(gè)Snackbar
如果在屏幕上有一個(gè)Snackbar的情況下再顯示一個(gè)Snackbar,則先將當(dāng)前顯示的Snackbar隱藏后再顯示新的Snackbar
可以在Snackbar中添加一個(gè)按鈕俱萍,處理用戶點(diǎn)擊事件
Snackbar一般需要CoordinatorLayout來(lái)作為父容器端壳,CoordinatorLayout保證Snackbar可以右滑退出
三、Snackbar的使用
通過上文的介紹枪蘑,我們對(duì)Snackbar的含義和功能有了基本了解损谦,接下來(lái)通過代碼來(lái)詳細(xì)介紹Snackbar的使用。
使用MD控件岳颇,首先要在gradle文件中導(dǎo)入依賴照捡,本文中使用的依賴包如下:implementation 'com.android.support:design:25.3.0'
彈出Snackbar,彈出Snackbar的方式和Toast方式相似话侧,通過調(diào)用Snackbar類中的靜態(tài)方法make()設(shè)置相關(guān)信息栗精,show()方法彈窗Snackbar
Snackbar.make(view, message, duration)
.setAction(action message, click listener)
.show();
1.make()實(shí)現(xiàn)簡(jiǎn)單彈出
make() 方法的第一個(gè)參數(shù)是一個(gè) view,snackbar 會(huì)找到一個(gè)父 view瞻鹏,以寄存所賦的 snackbar 值悲立。Snackbar 會(huì)沿著 view 的樹狀路徑鹿寨,找到第一個(gè)合適的布局或窗口視圖,作為父 view级历。一般是一個(gè)CoordinatorLayout對(duì)象释移。
第二個(gè)參數(shù)是Snackbar中想要顯示的內(nèi)容,一般只能顯示2行寥殖;
第三個(gè)參數(shù)是Snackbar想要顯示的時(shí)間長(zhǎng)短玩讳,有三個(gè)值:LENGTH_INDEFINITE 永遠(yuǎn)顯示、LENGTH_LONG顯示較長(zhǎng)時(shí)間嚼贡、LENGTH_SHORT 顯示較短時(shí)間熏纯;
Snackbar也要像Toast一樣,調(diào)用show()方法才能顯示粤策。
案例分析
首先樟澜,我們創(chuàng)建一個(gè)Activity,在布局文件中添加CoordinatorLayout控件叮盘,并創(chuàng)建一個(gè)FloatingActionButton秩贰,用于測(cè)試FloatingActionButton結(jié)合Snackbar的展示效果。布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ease.wawaandroid.testdemo.SnackbarActivity">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/snackbar_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.FloatingActionButton
android:id="@+id/snackbar_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:layout_marginBottom="10dp"
android:layout_marginRight="10dp"
app:borderWidth="0dp"
app:fabSize="normal" />
</android.support.design.widget.CoordinatorLayout>
</android.support.constraint.ConstraintLayout>
在Activity中對(duì)控件進(jìn)行初始化柔吼,并監(jiān)聽FloatingActionButton的點(diǎn)擊事件毒费,實(shí)現(xiàn)點(diǎn)擊FloatingActionButton,彈出Snackbar愈魏,Activity的代碼如下:
public class SnackbarActivity extends AppCompatActivity implements View.OnClickListener {
private CoordinatorLayout coordinatorLayout;
private FloatingActionButton fab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_snackbar);
initView();
}
private void initView() {
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.snackbar_container);
fab = (FloatingActionButton) findViewById(R.id.snackbar_fab);
fab.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.snackbar_fab:
Snackbar.make(coordinatorLayout, "這是一個(gè)snackbar", Snackbar.LENGTH_SHORT).show();
break;
}
}
}
執(zhí)行上述代碼觅玻,顯示效果為:
注意:mark()方法的第一個(gè)參數(shù)一定要是coordinatorLayout,否則培漏,彈出的Snackbar將覆蓋FloatingActionButton控件溪厘。
到這里就基本實(shí)現(xiàn)了Snackbar的簡(jiǎn)單彈出,但是牌柄,目前的效果和我們之前的Toast沒什么大的區(qū)別畸悬,同時(shí)發(fā)現(xiàn)案例中,我們并沒有調(diào)用Snackbar的setAction()方法珊佣。接下來(lái)傻昙,我們將開始介紹Snackbar的另一個(gè)重要方法setAction()。
2.setAction()添加按鈕
除了顯示之外彩扔,Snackbar中還可以有一個(gè)按鈕妆档,我們稱之為Action,它顯示在Snackbar的右邊虫碉,可以通過Snackbar對(duì)象的setAction()方法設(shè)置贾惦,修改上文中FloatingActionButton控件點(diǎn)擊事件的處理邏輯:
case R.id.snackbar_fab:
Snackbar.make(coordinatorLayout, "這是一個(gè)snackbar", Snackbar.LENGTH_SHORT)
.setAction("action", new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(coordinatorLayout, "Action 被點(diǎn)擊", Snackbar.LENGTH_SHORT).show();
}
})
.show();
break;
添加setAction()方法,該方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是按鈕的名稱须板,第二個(gè)參數(shù)是按鈕點(diǎn)擊事件的監(jiān)聽方法碰镜。顯示效果如下:
3.顯示隱藏監(jiān)聽
在Snackbar彈出和消失時(shí),都會(huì)觸發(fā)一個(gè)回調(diào)事件习瑰,我們可以通過Snackbar對(duì)象的addCallback()方法(setCallback()方法已經(jīng)過時(shí))捕獲它們:
Snackbar.make(coordinatorLayout, "這是一個(gè)snackbar", Snackbar.LENGTH_SHORT)
.setAction("action", new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(coordinatorLayout, "Action 被點(diǎn)擊", Snackbar.LENGTH_SHORT).show();
}
})
.addCallback(new Snackbar.Callback(){
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
super.onDismissed(transientBottomBar, event);
Toast.makeText(SnackbarActivity.this, "Snackbar隱藏", Toast.LENGTH_SHORT).show();
}
@Override
public void onShown(Snackbar sb) {
super.onShown(sb);
Toast.makeText(SnackbarActivity.this, "Snackbar顯示", Toast.LENGTH_SHORT).show();
}
})
.show();
Snackbar.Callback中有兩個(gè)抽象方法绪颖,onDismissed()方法是當(dāng)Snackbar消失的時(shí)候觸發(fā)的事件;onShown()方法是當(dāng)Snackbar顯示的時(shí)候觸發(fā)的事件甜奄。顯示效果如下所示:
4.相關(guān)屬性設(shè)置
Snackbar支持動(dòng)態(tài)的設(shè)置一些屬性柠横,如Action的文本顏色、顯示的文本內(nèi)容课兄、顯示的持續(xù)時(shí)間等牍氛,可通過下面方法進(jìn)行設(shè)置:
Snackbar snackbar = Snackbar.make(coordinatorLayout, "Action 被點(diǎn)擊", Snackbar.LENGTH_SHORT);
snackbar.setText("動(dòng)態(tài)文本");//動(dòng)態(tài)設(shè)置文本顯示內(nèi)容
snackbar.setActionTextColor(Color.RED);//動(dòng)態(tài)設(shè)置Action文本的顏色
snackbar.setDuration(5000);//動(dòng)態(tài)設(shè)置顯示時(shí)間
View snackbarView = snackbar.getView();//獲取Snackbar顯示的View對(duì)象
//獲取顯示文本View,并設(shè)置其顯示顏色
((TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text)).setTextColor(Color.BLUE);
//獲取Action文本View,并設(shè)置其顯示顏色
((TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_action)).setTextColor(Color.BLUE);
//設(shè)置Snackbar的背景色
snackbarView.setBackgroundColor(Color.GREEN);
//設(shè)置Snackbar顯示的位置
ViewGroup.LayoutParams params = snackbarView.getLayoutParams();
CoordinatorLayout.LayoutParams layoutParams = new CoordinatorLayout.LayoutParams(params.width, params.height);
layoutParams.gravity = Gravity.CENTER_VERTICAL;//垂直居中
snackbarView.setLayoutParams(layoutParams);
至此烟阐,Snackbar的相關(guān)使用就介紹完了搬俊。
四、Snackbar與Dialog和Toast的比較
通過上文的介紹蜒茄,我們知道了Snackbar和Dialog唉擂、Toast一樣都是用來(lái)作為android內(nèi)提示信息的,三者之間的應(yīng)用場(chǎng)景也有所不同檀葛。
Dialog
模態(tài)對(duì)話框楔敌。也就說,此刻該對(duì)話框中的內(nèi)容獲取了焦點(diǎn)驻谆,想要操作對(duì)話框以外的功能,必須先對(duì)該對(duì)話框進(jìn)行響應(yīng)庆聘。
應(yīng)用場(chǎng)景:對(duì)于刪除確認(rèn)胜臊、版本更新等重要性提示信息,需要用戶做出選擇的情況下伙判,使用Dialog象对。
Toast
非模態(tài)提示框。也就說提示框的顯示并不影響我們對(duì)其他地方的操作宴抚,Toast無(wú)法手動(dòng)控制隱藏勒魔,需要設(shè)置Toast的顯示時(shí)長(zhǎng),一旦顯示時(shí)間結(jié)束菇曲,Toast會(huì)自動(dòng)消失冠绢。如果多次點(diǎn)擊并顯示Toast,就會(huì)出現(xiàn)Toast重復(fù)創(chuàng)建并顯示常潮,給用戶造成一種Toast長(zhǎng)時(shí)間不隱藏的幻覺弟胀。
應(yīng)用場(chǎng)景:對(duì)于無(wú)網(wǎng)絡(luò)提示、刪除成功、發(fā)布操作完成等這類不重要的提示性信息孵户,使用Toast萧朝;
Snackbar
Snackbar和Toast比較相似,但是用途更加廣泛夏哭,并且它是可以和用戶進(jìn)行交互的检柬。Snackbar使用一個(gè)動(dòng)畫效果從屏幕的底部彈出來(lái),過一段時(shí)間后也會(huì)自動(dòng)消失竖配。
應(yīng)用場(chǎng)景:刪除操作時(shí)何址,彈出Snackbar用于確認(rèn)刪除操作;消息發(fā)送失敗時(shí)械念,彈出Snackbar头朱,用于重新發(fā)送操作;當(dāng)然重要的是與MD組件相結(jié)合龄减,用戶體驗(yàn)效果更佳项钮。