Android 一文告訴你到底是用Dialog元媚,Snackbar,還是Toast

Dialog和Toast苗沧,大家一定非常熟悉刊棕,常常被用來(lái)作為Android應(yīng)用內(nèi)提示性信息的兩種展示方式。然而Google在Design包中又提供了一種新的選擇待逞,那就是Snackbar甥角。這三種提示框到底有什么區(qū)別呢,使用時(shí)到底該如何選擇呢识樱?不妨跟著本文一起學(xué)習(xí)一下吧嗤无。

Dialog


模態(tài)對(duì)話框。也就說(shuō)怜庸,此刻該對(duì)話框中的內(nèi)容獲取了焦點(diǎn)当犯,想要操作對(duì)話框以外的功能,必須先對(duì)該對(duì)話框進(jìn)行響應(yīng)休雌。

借助AlertDialog類可以快速實(shí)現(xiàn)一個(gè)Dialog的展示,注意Android中的AlertDialog采用了建造者模式肝断,代碼如下:

    public void onClickDialog(View v){
        new AlertDialog.Builder(this)
                .setTitle("Title")
                .setMessage("This is message")
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                .setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                .create()
                .show();
    }

效果如圖:

Dialog 圖一.png

需要注意的是杈曲,不同版本的系統(tǒng)下,android.app.AlertDialog包中的AlertDialog展示樣式不太一樣胸懈。上圖是在6.0系統(tǒng)下展示的效果担扑,屬于MD風(fēng)格樣式。我們?cè)倏匆幌翧ndroid 4.4.4系統(tǒng)的默認(rèn)樣式:

Dialog 圖二.png

是不是很丑趣钱,大家可以自己嘗試涌献,在更低版本中,系統(tǒng)Dialog的默認(rèn)樣式更丑首有!不過(guò)值得慶幸的是燕垃,在V7包中枢劝,有AlertDialog的兼容版!大家在使用的時(shí)候可以使用android.support.v7.app.AlertDialog卜壕,這樣您旁,就能夠在不同的版本中統(tǒng)一使用MD風(fēng)格下的默認(rèn)樣式的Dialog,就像圖一展示的那樣轴捎。

補(bǔ)充一點(diǎn)鹤盒,在Android 5.0也就是Android L之后,Button的默認(rèn)樣式會(huì)導(dǎo)致英文字母大寫侦副,我們可以通過(guò)設(shè)置android:textAllCaps="false"屬性來(lái)處理這個(gè)問題侦锯。對(duì)于AlertDialog,可以操作Theme樣式秦驯,但有一點(diǎn)需要注意尺碰,就是在values文件夾theme中設(shè)置的時(shí)候不能直接使用這個(gè)屬性,會(huì)導(dǎo)致版本兼容問題汇竭,只要去掉android:命名空間即可葱蝗,如:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/blue</item>
        <item name="colorPrimaryDark">@color/blue_dark</item>
        <item name="colorAccent">@color/red</item>
        <item name="textAllCaps">false</item>
    </style>

Toast


非模態(tài)提示框。也就說(shuō)提示框的顯示并不影響我們對(duì)其他地方的操作细燎,Toast無(wú)法手動(dòng)控制隱藏两曼,需要設(shè)置Toast的顯示時(shí)長(zhǎng),一旦顯示時(shí)間結(jié)束玻驻,Toast會(huì)自動(dòng)消失悼凑。代碼如下:

    public void onClickToast(View v){
        Toast.makeText(this, "This is a Toast", Toast.LENGTH_SHORT).show();
    }

顯示效果如圖:

Toast.gif

Toast的使用也有一個(gè)需要注意的地方,由于Toast是非模態(tài)的璧瞬,如果多次點(diǎn)擊并顯示Toast户辫,就會(huì)出現(xiàn)Toast重復(fù)創(chuàng)建并顯示,給用戶造成一種Toast長(zhǎng)時(shí)間不隱藏的幻覺嗤锉,如圖:

Toast Repeat.gif

顯然渔欢,這種現(xiàn)象非常影響用戶體驗(yàn),為了解決這種問題瘟忱,我們可以對(duì)Toast的顯示做一個(gè)封裝奥额,使用Static全局變量,建一個(gè)ToastUtils工具類访诱,始終使用一個(gè)Toast顯示信息垫挨,代碼如下:

public class ToastUtils {

    private static Toast toast;

    public static void showToast(Context context, String message) {
        if (toast == null) {
            toast = Toast.makeText(context, message, Toast.LENGTH_SHORT);
        } else {
            toast.setText(message);
        }
        toast.show();
    }

}

封裝之后,Toast顯示時(shí)長(zhǎng)始終是我們?cè)O(shè)置的Toast.LENGTH_SHORTToast.LENGTH_LONG触菜,如圖:

Toast 工具類情景.gif

Snackbar


Snackbar是Design包中提出的一種介于Dialog和Toast之間的新控件九榔。我們先來(lái)看一下它的使用代碼:

    public void onClickSnackbar(View v){
        Snackbar.make(this.findViewById(android.R.id.content), "This is a Snackbar", Snackbar.LENGTH_SHORT)
                .setAction("Cancel", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                    }
                })
                .show();
    }

可以看出,Snackbar的使用與Toast特別像,唯獨(dú)多了個(gè)setAction方法哲泊。這里需要說(shuō)明一下make方法的第一個(gè)參數(shù)剩蟀,是一個(gè)View對(duì)象,先看一下源碼介紹:

Snackbar will try and find a parent view to hold Snackbar's view from the value given* to {@code view}. Snackbar will walk up the view tree trying to find a suitable parent,* which is defined as a {@link CoordinatorLayout} or the window decor's content view,* whichever comes first.

也就是說(shuō)攻旦,Snackbar將從這個(gè)View參數(shù)找出當(dāng)前窗口最外層視圖喻旷,然后在其底部顯示。所以牢屋,如果當(dāng)前是Activity且预,這個(gè)View可以是Activity中的任何一個(gè)元素,也可以像上面示例代碼中那樣烙无,直接使用Activity的ContentView锋谐。Snackbar顯示效果如圖:

Snackbar With Action.gif

相比Toast,Snackbar多了個(gè)可操作的按鈕截酷,并為其設(shè)置文本內(nèi)容和監(jiān)聽事件涮拗,用于手動(dòng)控制彈框的隱藏。當(dāng)然迂苛,也可以不設(shè)置按鈕三热,這種情況,Snackbar只能在到達(dá)顯示時(shí)長(zhǎng)后自動(dòng)隱藏三幻,如圖:

Snackbar Without Action.gif

小結(jié)


Dialog就漾,Snackbar,Toast都可以作為應(yīng)用內(nèi)的一種提示框來(lái)使用念搬,但從各自的特性來(lái)看抑堡,三者所表現(xiàn)出來(lái)的重要性為:Dialog > Snackbar > Toast 。所以朗徊,不同的應(yīng)用場(chǎng)景下首妖,選擇一個(gè)合適的方式來(lái)顯示提示性信息,對(duì)于提升用戶體驗(yàn)來(lái)說(shuō)爷恳,也是非常重要的有缆。

  • 對(duì)于刪除確認(rèn)、版本更新等重要性提示信息温亲,需要用戶做出選擇的情況下棚壁,使用Dialog;

  • 對(duì)于無(wú)網(wǎng)絡(luò)提示铸豁、刪除成功灌曙、發(fā)布操作完成等這類不重要的提示性信息菊碟,使用Toast节芥;

  • 介于二者之間的其它情況,不妨使用Snackbar,給用戶一個(gè)多重選擇也許會(huì)是一個(gè)不錯(cuò)的方式头镊。

參考鏈接:
http://blog.csdn.net/guolin_blog/article/details/51336415

示例源碼


我在GitHub上建立了一個(gè)Repository蚣驼,用來(lái)存放整個(gè)Android Material Design系列控件的學(xué)習(xí)案例,會(huì)伴隨著文章逐漸更新完善相艇,歡迎大家補(bǔ)充交流颖杏,Star地址:

https://github.com/Mike-bel/MDStudySamples

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坛芽,隨后出現(xiàn)的幾起案子留储,更是在濱河造成了極大的恐慌,老刑警劉巖咙轩,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件获讳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡活喊,警方通過(guò)查閱死者的電腦和手機(jī)丐膝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钾菊,“玉大人帅矗,你說(shuō)我怎么就攤上這事∩诽蹋” “怎么了浑此?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)红竭。 經(jīng)常有香客問我尤勋,道長(zhǎng),這世上最難降的妖魔是什么茵宪? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任最冰,我火速辦了婚禮,結(jié)果婚禮上稀火,老公的妹妹穿的比我還像新娘暖哨。我一直安慰自己,他們只是感情好凰狞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布篇裁。 她就那樣靜靜地躺著,像睡著了一般赡若。 火紅的嫁衣襯著肌膚如雪达布。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天逾冬,我揣著相機(jī)與錄音黍聂,去河邊找鬼躺苦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛产还,可吹牛的內(nèi)容都是我干的匹厘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼脐区,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼愈诚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起牛隅,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炕柔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后媒佣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汗唱,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年丈攒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哩罪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巡验,死狀恐怖际插,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情显设,我是刑警寧澤框弛,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站捕捂,受9級(jí)特大地震影響瑟枫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜指攒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一慷妙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧允悦,春花似錦膝擂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至全闷,卻和暖如春叉寂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背总珠。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工屏鳍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伊约,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓孕蝉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親腌逢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子降淮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,744評(píng)論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,727評(píng)論 22 665
  • 一、純代碼跳轉(zhuǎn) UIViewController *Vc = [[UIViewController alloc] ...
    Lambo316閱讀 430評(píng)論 0 1
  • 昨夜的明月如我借你未還的盤子 望著孤懸的皎月這么想 如果此刻你恰巧也在欣賞這輪滿月 我可以看到你的雙眼 你的面龐 ...
    獨(dú)釣寒江_cd35閱讀 488評(píng)論 4 4
  • 今年的八月份搏讶,我開始了獨(dú)立的生活佳鳖。 以前的工作是管食宿的,所以我不需要做飯媒惕,當(dāng)然了系吩,我也不會(huì)做。但...
    Sunny大珂閱讀 634評(píng)論 0 1