概述
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方法沒什么可說的
2.顯示Item列表
首先創(chuàng)建一個數(shù)組?String[]datas=new String[]{"北京","上海","廣州"}; 然后調(diào)用setItems方法把數(shù)組放進(jìn)去并實現(xiàn)對應(yīng)的點擊事件
3.單選Dialog
同樣地需要一個數(shù)組默勾,然后調(diào)用setSingleChoiceItems碉渡,把數(shù)組放入里面,第二參數(shù)放值默認(rèn)選種的item的下標(biāo)母剥,同時要實現(xiàn)對應(yīng)的點擊事件
4.多選Dialog
多選的Dialog跟單選的比較像滞诺,調(diào)用的方法時setMultiChoiceItems只不過第二個參數(shù)不是默認(rèn)選中的item下標(biāo)了,而是一個boolean值的數(shù)組环疼,用true/false代表item是否被選中
5.實現(xiàn)ListAdapter的Dialog
同顯示Item列表的Dialog比較類似习霹,只不過增加了adapter,adapter只要是ListAdapter的子類就可以炫隶,可以自己實現(xiàn)淋叶,本文使用的是ArrayAdapter。
6.自定義Dialog
這個可能是比較常用的伪阶,畢竟我們想讓自己的Dialog使用我們自己的風(fēng)格煞檩。使用起來也很簡單,
View view=View.inflate(mContext,R.layout.dialog_custom_view,null); 創(chuàng)建出自己的view對象栅贴,然后setView(view)調(diào)用就行了
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"); ?這一句就搞定了
先來看一下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
創(chuàng)建接受數(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