Dialog的使用

概述

Dialog是Android的提示框泰讽,雖然說是很基礎(chǔ)的東西她渴,但是里面其實還有很多值得學(xué)習(xí)交流的地方。本文將從以下三個方面學(xué)習(xí)Dialog:

? ? ?1.夯實基礎(chǔ)--AlertDialog的六種使用方式

? ? ?2.使用DialogFragment代替Dialog

? ? ?3.使用RxBus優(yōu)雅地完成Activity與DialogFragment的數(shù)據(jù)交互

注:本文所有的具體代碼實現(xiàn)都在文章最后的github連接上

1.AlertDialog的六種使用方式

雖然android提供了Dialog這個類,但是谷歌不建議我們直接使用Dialog,而是使用他的子類AlertDialog。下面我們就研究一下AlertDialog這個類稿静。AlertDialog是Dialog的子類,此對話框可以顯示標(biāo)題辕狰、最多三個按鈕改备,同時支持列表或自定義布局。一般來說蔓倍,AlerDialog有6種簡單的用法悬钳,下面我們逐一介紹一下盐捷。

? (1).顯示標(biāo)題和內(nèi)容

這里很簡單,就是調(diào)用setTitle和setMessage方法沒什么可說的

顯示內(nèi)容和標(biāo)題


2.顯示Item列表

首先創(chuàng)建一個數(shù)組?String[]datas=new String[]{"北京","上海","廣州"}; 然后調(diào)用setItems方法把數(shù)組放進(jìn)去并實現(xiàn)對應(yīng)的點擊事件

顯示Item列表

3.單選Dialog

同樣地需要一個數(shù)組默勾,然后調(diào)用setSingleChoiceItems碉渡,把數(shù)組放入里面,第二參數(shù)放值默認(rèn)選種的item的下標(biāo)母剥,同時要實現(xiàn)對應(yīng)的點擊事件


單選Dialog

4.多選Dialog

多選的Dialog跟單選的比較像滞诺,調(diào)用的方法時setMultiChoiceItems只不過第二個參數(shù)不是默認(rèn)選中的item下標(biāo)了,而是一個boolean值的數(shù)組环疼,用true/false代表item是否被選中


多選Dialog

5.實現(xiàn)ListAdapter的Dialog

同顯示Item列表的Dialog比較類似习霹,只不過增加了adapter,adapter只要是ListAdapter的子類就可以炫隶,可以自己實現(xiàn)淋叶,本文使用的是ArrayAdapter。


實現(xiàn)ListAdapter的Dialog

6.自定義Dialog

這個可能是比較常用的伪阶,畢竟我們想讓自己的Dialog使用我們自己的風(fēng)格煞檩。使用起來也很簡單,

View view=View.inflate(mContext,R.layout.dialog_custom_view,null); 創(chuàng)建出自己的view對象栅贴,然后setView(view)調(diào)用就行了


自定義Dialog

2.使用DialogFragment代替Dialog

AlertDialog雖然使用起來很簡單斟湃、方便,但是其還是存在一些缺陷和問題筹误。最主要的就是手機(jī)橫豎屏后被銷毀數(shù)據(jù)丟失桐早,多個AlertDialog管理起來很麻煩。為此厨剪,谷歌在3.0以后推出了DialogFragment來代替Dialog哄酝。DialogFragment繼承自Fragment,這就說明DialogFragment擁有和普通Fragment一模一樣的生命周期祷膳,我們可以同管理Fragment來管理Dialog陶衅。閑話不多說,干就完了直晨。

DialogFragment創(chuàng)建Dialog有兩種方式搀军,一種是在onCreateView創(chuàng)建自定義Dialog(不推薦),另一種是重寫onCreateDialog勇皇,里面可以創(chuàng)建AlertDialog直接返回罩句。而調(diào)用也很簡單MyDialogFragment.newInstance(DialogType.CUSTOMVIEW).show(getSupportFragmentManager(),"TEST"); ?這一句就搞定了

在onCreateView創(chuàng)建


重寫onCreateDialog

先來看一下DialogFragment的效果,這里本來是放個gif的敛摘,但是使用AS錄制以后的質(zhì)量太差了门烂,只能用兩個切圖湊合看了。


豎屏
橫屏

可以看出來在切換屏幕橫豎屏都不會影響到Dialog和里面的數(shù)據(jù),并且對DialogFragment還可以進(jìn)行方便屯远。

3.使用RxBus優(yōu)雅地實現(xiàn)DialogFragment和Activity的交互

一般情況下蔓姚,我們做DialogFragment和Activity的交互都是接口回調(diào)。以上圖的DialogFragment為例子慨丐。在DialogFragment里定義一個接口坡脐,里面設(shè)置一個回調(diào)方法。比如:interface OnUserDialogBack{ void onUserBack(String uname,String pwd); 定義好接口之后房揭,讓宿主Activity實現(xiàn)該接口备闲,并重寫回調(diào)方法,然后再在DialogFragement聲明一個接口變量 private OnUserDialogBack mListener,在onAttach(Context context)把傳來的context強制轉(zhuǎn)型成 mListener對象崩溪,最后在onCreateDialog獲取到姓名和密碼就可以直接調(diào)用mListener.onUserBack(uname,pwd)就完成了浅役。 這是傳統(tǒng)地處理DialogFragment和Activity的交互的方法,但是缺點卻很明顯伶唯,首先Dialog使用地很多很頻繁觉既,使用一個Dialog就對接得要創(chuàng)建一個接口,接口如果多了管理起來就很麻煩了乳幸。還有就是這種方法瞪讼,代碼量也比較多,還需要在onAttach(Context context)里面轉(zhuǎn)型才能使用粹断。那能不能有一種更為簡單和優(yōu)雅的方式來解決這個問題呢符欠?當(dāng)然是肯定的,那就是使用事件總線來解決瓶埋。

EventBus或者Otto都可以作為事件總線通信庫希柿,但是筆者推薦RxBus。RxBus不是類庫养筒,而是一種模式曾撤,使用RxBus可以減少庫的依賴,并且RxJava是一種觀察者模式晕粪,可以很好地完成事件通信挤悉。

關(guān)于RxBus現(xiàn)在不懂也沒大關(guān)系,會用就行了巫湘,等過段時間筆者會幾篇介紹一下RxJava及其相關(guān)的類庫的使用装悲。好了,不啰嗦了尚氛,開干诀诊。

引入RxJava(我的項目使用的是RxJava2.x,用1.x也完全沒問題)




compile "io.reactivex.rxjava2:rxjava:2.0.6"




compile "io.reactivex.rxjava2:rxandroid:2.0.1"




創(chuàng)建工具類RxBus

RxBus代碼

創(chuàng)建接受數(shù)據(jù)的對象

接收數(shù)據(jù)對象

在宿主Activity的onCreate里訂閱事件阅嘶,在onDestory里取消訂閱

訂閱事件
取消訂閱

最后一步在Dialog把獲取的用戶名和密碼發(fā)送出去属瓣,一行代碼解決

RxBus.getDefault().send(new DialogEvent(name,pwd));

就這么簡單、優(yōu)雅!

總結(jié)

AlertDialog的基本用法要掌握奠涌,因為AlertDialog可以滿足我們絕大多數(shù)情況的Dialog使用,而引入DialogFragment則可以幫助我們解決橫豎屏和Dialog的管理問題磷杏,最后就是Activity和DialogFragment之間交互的問題溜畅,我們使用事件總線的方法,可以讓代碼更加簡潔极祸、優(yōu)雅慈格。

最后放上我的項目github:GitHub - kaka10xiaobang/DialogDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遥金,隨后出現(xiàn)的幾起案子浴捆,更是在濱河造成了極大的恐慌,老刑警劉巖稿械,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件选泻,死亡現(xiàn)場離奇詭異,居然都是意外死亡美莫,警方通過查閱死者的電腦和手機(jī)页眯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厢呵,“玉大人窝撵,你說我怎么就攤上這事〗竺” “怎么了碌奉?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寒砖。 經(jīng)常有香客問我赐劣,道長,這世上最難降的妖魔是什么入撒? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任隆豹,我火速辦了婚禮,結(jié)果婚禮上茅逮,老公的妹妹穿的比我還像新娘璃赡。我一直安慰自己,他們只是感情好献雅,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布碉考。 她就那樣靜靜地躺著,像睡著了一般挺身。 火紅的嫁衣襯著肌膚如雪侯谁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音墙贱,去河邊找鬼热芹。 笑死,一個胖子當(dāng)著我的面吹牛惨撇,可吹牛的內(nèi)容都是我干的伊脓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼魁衙,長吁一口氣:“原來是場噩夢啊……” “哼报腔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起剖淀,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤纯蛾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纵隔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翻诉,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年巨朦,在試婚紗的時候發(fā)現(xiàn)自己被綠了米丘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡糊啡,死狀恐怖拄查,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棚蓄,我是刑警寧澤堕扶,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站梭依,受9級特大地震影響稍算,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜役拴,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一糊探、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧河闰,春花似錦科平、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至部念,卻和暖如春弃酌,著一層夾襖步出監(jiān)牢的瞬間氨菇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工妓湘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留查蓉,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓榜贴,卻偏偏與公主長得像奶是,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子竣灌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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