Android重要控件SnackBar使用方法詳解
SnackBar是DesignSupportLibrary中的一個(gè)重要的控件,用于在界面下面提示一些關(guān)鍵信息,跟Toast不同的地方是SnackBar允許用戶向右滑動(dòng)消除它,同時(shí),也允許在SnackBar中設(shè)定一個(gè)Action,當(dāng)用戶點(diǎn)擊了SnackBar里面的按鈕的時(shí)候,可以進(jìn)行一些操作,所以,功能絕對是很強(qiáng)大的。
SnackBar的構(gòu)造:
// 參數(shù)分別是父容器,提示信息,持續(xù)時(shí)間public static Snackbar make(@NonNull View view, @NonNull CharSequence text,@Duration int duration)
SnackBar的常用方法:
// 用于給SnackBar設(shè)定一個(gè)Action,點(diǎn)擊之后會(huì)回調(diào)OnclickListener中的Onclick方法public Snackbar setAction(CharSequence text, final View.OnClickListener listener) // 用于設(shè)定Action的字體顏色public Snackbar setActionTextColor(@ColorInt int color) // 設(shè)定提示的字體public Snackbar setText(@NonNull CharSequence message) // 展示SnackBarpublic void show() // 清除SnackBarpublic void dismiss() // 設(shè)置回調(diào),比如OnDismissed或者OnShownpublic Snackbar setCallback(Callback callback)
簡單是使用就不說了,這里直接說一下設(shè)置Action和設(shè)置Callback
要求:實(shí)現(xiàn)一個(gè)撤銷的操作,用戶點(diǎn)擊列表中每一項(xiàng)的刪除按鈕之后,刪除(數(shù)據(jù)庫中)對應(yīng)的行,然后彈出SnackBar提示是否撤銷,如果選擇是,則恢復(fù)刪除的行,否則刪除該行,效果如下
思路:
①先對我們要?jiǎng)h除的這個(gè)行進(jìn)行備份,然后在點(diǎn)擊刪除按鈕的時(shí)候把行刪除,把數(shù)據(jù)從源刪除,然后刷新
②彈出SnackBar,設(shè)定Action,如果點(diǎn)了Yes,就把數(shù)據(jù)插入到源中,刷新
③設(shè)定CallBack,監(jiān)聽SnackBar的消失事件,如果不是點(diǎn)擊Action而消失,則將數(shù)據(jù)從SQLite中刪除
注意:這里為什么要設(shè)定監(jiān)聽?因?yàn)槿绻贿M(jìn)行監(jiān)聽,需要在刪除的時(shí)候訪問數(shù)據(jù)庫,撤銷是時(shí)候進(jìn)行數(shù)據(jù)庫的插入操作,這樣列表中的條目位置會(huì)發(fā)生改變
我們可以在Adapter中對刪除按鈕進(jìn)行監(jiān)聽,代碼如下:
delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { backupMap = mdata.get(position); mdata.remove(position); notifyDataSetChanged(); Snackbar snackBar = Snackbar.make(root, "是否撤銷刪除?", Snackbar.LENGTH_LONG); snackBar.setAction("YES", new MyOnClickListener(position)); snackBar.setCallback(new MyCallback()); snackBar.show(); } });
如果點(diǎn)擊了刪除按鈕,我們對數(shù)據(jù)進(jìn)行備份,然后刪除數(shù)據(jù)源mdata對應(yīng)的這個(gè)map,接下來刷新界面。然后第7行構(gòu)造了一個(gè)SnackBar,詢問是否撤銷刪除,并把持續(xù)時(shí)間設(shè)置為LONG以免用戶未閱讀完文字SnackBar就消失了。第8行設(shè)定了點(diǎn)擊的Action,提示信息為“YES”,并提供了點(diǎn)擊的監(jiān)聽。第9行設(shè)定了Callback,判斷SnackBar的消失狀態(tài)。第10行就直接把SnackBar展示出來。
下面來看Action的點(diǎn)擊事件:
private class MyOnClickListener implements View.OnClickListener { private final int position; public MyOnClickListener(int position) { this.position = position; } @Override public void onClick(View v) { mdata.add(position, backupMap); notifyDataSetChanged(); } }
如果點(diǎn)擊了Action,就用備份的數(shù)據(jù)進(jìn)行恢復(fù)
下面看Callback:
private class MyCallback extends Snackbar.Callback { @Override public void onDismissed(Snackbar snackbar, int event) { super.onDismissed(snackbar, event); if (event == DISMISS_EVENT_SWIPE || event == DISMISS_EVENT_TIMEOUT || event == DISMISS_EVENT_CONSECUTIVE) { mdatabase.execSQL("delete from tally where id=?", new String[]{backupMap.get ("id").toString()}); } } }
這里看到我們重寫了onDismissed方法,在SnackBar消失的時(shí)候會(huì)回調(diào)這個(gè)方法,我們先判斷這個(gè)消失的類型,如果是點(diǎn)擊了Action,就不用刪除數(shù)據(jù)庫中的數(shù)據(jù),否則就對數(shù)據(jù)庫進(jìn)行刪除。
SnackBar消失的類型對應(yīng)的常量:
/** Indicates that the Snackbar was dismissed via a swipe.*/ public static final int DISMISS_EVENT_SWIPE = 0; /** Indicates that the Snackbar was dismissed via an action click.*/ public static final int DISMISS_EVENT_ACTION = 1; /** Indicates that the Snackbar was dismissed via a timeout.*/ public static final int DISMISS_EVENT_TIMEOUT = 2; /** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/ public static final int DISMISS_EVENT_MANUAL = 3; /** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/ public static final int DISMISS_EVENT_CONSECUTIVE = 4;
可以看到,從0到4分別是滑動(dòng)清除、點(diǎn)擊Action、持續(xù)時(shí)間結(jié)束、調(diào)用dismiss方法以及有新的SnackBar產(chǎn)生
因?yàn)槊看蜸nackBar消失的時(shí)候都是調(diào)用了dismiss方法,所以我們只需要判斷此時(shí)的狀態(tài)是否為滑動(dòng)清除、持續(xù)時(shí)間結(jié)束或者新的SnackBar產(chǎn)生,如果是,則證明用戶不需要撤銷,則對數(shù)據(jù)庫進(jìn)行刪除。
最后,如果使用SnackBar,記得添加依賴?。?br />
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android仿微信實(shí)現(xiàn)首字母導(dǎo)航條
這篇文章主要為大家詳細(xì)介紹了Android仿微信實(shí)現(xiàn)首字母導(dǎo)航條的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Android手機(jī)通過藍(lán)牙連接佳博打印機(jī)的實(shí)例代碼
這篇文章主要介紹了Android手機(jī)通過藍(lán)牙連接佳博打印機(jī)的實(shí)例代碼,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11Android開發(fā)中的數(shù)據(jù)庫事務(wù)用法分析
這篇文章主要介紹了Android開發(fā)中的數(shù)據(jù)庫事務(wù)用法,分析了Android數(shù)據(jù)庫事務(wù)的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-06-06總結(jié)Android中MD風(fēng)格相關(guān)控件
自Android5.0發(fā)布以來,谷歌推出全新的Material Desigen設(shè)計(jì)風(fēng)格,時(shí)過一年多了,在國內(nèi)也看到很多應(yīng)用在慢慢適應(yīng)MD設(shè)計(jì)風(fēng)格。今天小編給大家總結(jié)下Android中MD風(fēng)格相關(guān)控件的知識(shí),有需要的可以參考學(xué)習(xí)。2016-08-08Android創(chuàng)建Menu菜單實(shí)例
這篇文章主要介紹了Android創(chuàng)建Menu菜單實(shí)例,講述了Android菜單項(xiàng)的創(chuàng)建方法,在Android應(yīng)用程序開發(fā)中非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10Android源碼解析onResume方法中獲取不到View寬高
這篇文章主要為大家介紹了Android源碼解析onResume方法中獲取不到View寬高示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Android拼圖游戲 玩轉(zhuǎn)從基礎(chǔ)到應(yīng)用手勢變化
這篇文章主要介紹了Android拼圖游戲的實(shí)現(xiàn)方法,教大家玩轉(zhuǎn)從基礎(chǔ)到應(yīng)用手勢變化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10