1 前言
上文我們實現(xiàn)了基本的對話框王悍,但是這個話題并沒有進行完。我們緊接上文,沒有廣告,精彩馬上開始搔谴。
2自定義對話框視圖
使用AlertDialog創(chuàng)建對話框大州,實現(xiàn)自定義視圖是非常簡單的事情纵刘,只需要調用setView(View v)方法傳入一個View就行了弃酌,so easy!當然,如果你將確定或取消的按鈕自己寫在了布局里暗膜,點擊后你就需要自己去控制對話框的關閉了匀奏。
3 DialogFragment簡介
DialogFragment是個什么鬼?從名字看是對話框碎片学搜,沒錯娃善,我為我的英文水平感到驕傲论衍。在Android3.0出現(xiàn)碎片之后,google官方就強烈推薦使用DialogFragment代替直接使用AlertDialog聚磺,在我個人使用下來的感受是坯台,確實比之前靈活很多。為什么要放棄直接使用AlertDialog呢瘫寝?原因有三:
- 碎片的復用性更好蜒蕾,碎片對話框不光能最為一個對話框,還能當成一個普通的碎片來復用
- 碎片有完整的生命周期焕阿,更好管理對話框的創(chuàng)建咪啡、顯示、銷毀
- 和Activity實現(xiàn)了完全的解耦暮屡,使用這種方式撤摸,你的對話框和Activity基本上沒啥關系
4 DialogFragment的用法
記好,DialogFragment有兩個身份:
1.對話框
2.普通的Fragment
如果你只想單純的把它當做一個對話框使用褒纲,你應該用這個姿勢使用它
繼承自DialogFragment
1.創(chuàng)建准夷。復寫public Dialog onCreateDialog(Bundle savedInstanceState)方法,注意莺掠,返回值是一個Dialog衫嵌。此方法用來創(chuàng)建一個對話框,onCreateDialog方法內實現(xiàn)和上文提到的AlertDialog完全一致彻秆,只需要在最后將創(chuàng)建好的AlertDialog返回回去就行了
2.顯示楔绞。使用show(FragmentManager manager, String tag) 方法去顯示出來
3.銷毀 。點擊任何一個按鈕或者對話框之外的區(qū)域都會銷毀掖棉,這點和AlertDialog的特性是一致的
使用這種方式創(chuàng)建對話框的特點:
1.不再是雙重身份墓律,只能作為一個對話框存在,相當于DialogFragment只是作為承載AlertDialog的容器了幔亥。
2.DialogFragment沒有后退棧
3.顯示的時候有兩個show方法:show(FragmentManager manager, String tag)show(FragmentTransaction transaction, String tag),注意這兩個方法的第一個參數(shù)類型不同察纯,這里使用哪個都可以帕棉,只是既然沒有后退棧,就沒必要傳入事務了饼记,推薦優(yōu)先使用前者
那如何才能讓DialogFragment具有雙重身份呢香伴?讓我們換個姿勢使用它。
1.繼承自它自然不必強調了
2.創(chuàng)建的時候具则,復寫public View onCreateView()方法即纲,是不是覺得很熟悉啊博肋?沒錯低斋,就是和普通的Fragment創(chuàng)建視圖的方式完全一樣
3.顯示蜂厅。這里需要分兩種情況,也就是說你需要讓它以對話框身份顯示還是以普通Fragment方式顯示膊畴。如果是作為對話框掘猿,調用show方法就可以了,show方法的第一個參數(shù)仍然傳遞碎片管理者或碎片事務都行唇跨,區(qū)別在于碎片事務支持后退棧稠通;如果作為普通碎片使用的話,那就不必多說了买猖,和平時的使用方式完全一致改橘,使用碎片事務進行add操作并提交就行了。
這種創(chuàng)建方式的特點:
1.創(chuàng)建時和普通碎片用法完全一致玉控,我們可以平滑的過渡唧龄,降低學習成本
2.靈活性高,雙重身份
3.支持后退棧奸远,可以使用碎片事務的全部特性
個人認為既棺,第二種創(chuàng)建方式明顯優(yōu)于第一種,這也許是google大力提倡使用DialogFragment代替AlertDialog的最主要的原因吧