【FasterDialog】可能是Android上最好用的Dialog框架

https://github.com/XXQAQ/FasterDialog

前言:FasterDialog是一個完全解耦彈窗邏輯與布局樣式的三方框架,即便你的眾多項目有不同的布局樣式需求,只要引入FasterDialog就可以讓你的所有項目都用同一份代碼描述業務邏輯。

在你的項目設計中,你的UI設計師曾可能提過如下需求:

圖1
圖2
圖3

針對以上的各式各樣的需求,以前我們會在每個項目編寫滿足對應項目需要的Dialog。實際上,在自定義Dialog的過程中,我們發現除了布局或者控件位置樣式等屬性不同之外,剩余百分之90的邏輯代碼都是相似或相同的。

那么,有沒有那么一種辦法,可以讓我們無需書寫這百分之90的重復性代碼,通過某種協議協定一些規則,使我們的代碼兼容所有的UI場景,而在使用的過程,只需要通過一個簡單方法就可以將Dialog樣式切換到指定布局方案。如下所示

//使用上圖1的布局方案

new NormalDialog(getContext()).setCustomView(R.layout.layout_1).setTitle("刪除").setContent("確定要刪除所選的一個會話嗎?").setPositiveText("刪除").setNegativeText("取消").show();

//使用上圖2的布局方案

new NormalDialog(getContext()).setCustomView(R.layout.layout_2).setTitle("賬號在其他設備登陸").setContent("您的支付寶賬號于...(內容過長遂省略)").setPositiveText("好的").setNegativeText("重置密碼").show();

//使用上圖3的布局方案

new NormalDialog(getContext()).setCustomView(R.layout.layout_3).setTitle("確定注銷").setContent("確定注銷當前賬號?").setPositiveText("確定").setNegativeText("取消").show();

是的,FasterDialog的設計理念就是如此!每當我們有新的UI需求,保持代碼層無需改動自行編寫項目所需要的布局文件,通過設定不同的layout就可以將Dialog切換至不同的布局方案。這樣具備極高的解耦性,也大大降低了代碼維護成本。So,為了使程序員不再重復寫百分之90的代碼而專精于業務需求,設計了FasterDialog。

除此之外,FasterDialog還具備以下特性:

1.動態變化;即使在Dialog show出來以后,依然可以通過setTitle setXXX這樣的方法動態改變Dialog中顯示的內容

2.無需權限,無Activity環境彈窗

3.封裝了一些Dialog常用但實現略微繁瑣的方法;一個方法就可以讓你的Dialog實現如 底部彈窗(是的,官方的BottomDialog被FasterDialog一個方法即可取代),頂部彈窗,寬高屏占比,最大寬高值,自動消失等功能

4.其他:鏈式調用、擴展預留


Dialog分類

在介紹分類之前,我們先翻閱官方AlertDialog的源碼。給我的第一感受是功能冗雜,API繁多。明明有很多方法只能在特定場景下使用,放在子類更合適,但AlertDialog偏偏全都強行加了進去。首先從設計上來說不利于后續擴展,而且由于身兼多職也導致無法專精于某一個模塊。

所以考慮到此,FasterDialog細分了各個模塊的作用域,針對App上常見的Dialog類型進行了如下分類:

LoadingDialog


NormalDialog


ImageDialog


ProgressDialog


ListDialog


EditDialog

如上圖所示,不同的Dialog專精于不同的模塊,不會出現功能混雜的情況。當然,如果我制定的Dialog不滿足你的項目需求,你也可以直接繼承對應的Dialog,不需要大刀闊斧地修改,幾分鐘之內就可在項目中使用。

PS:再次強調,以上所有效果圖僅為FasterDialog自帶默認布局方案,除此之外FasterDialog還包含Meterail布局方案,你也可以自行編寫xml布局,Dialog最終效果由你自己決定。


API

所有Dialog通用方法

BaseDialog dialog;? ? ? ? //所有Dialog均繼承于BaseDialog,因此所有子類均可調用以下方法。

dialog.setCustomView()//設置彈窗的layoutID,默認已有

? ? ? .setWidth()//設置彈窗寬度(單位px)

? ? ? .setWidthWrap()//設置彈窗寬為內容包裹

? ? ? .setWidthMatch()//設置彈窗寬為填充屏幕

? ? ? .setWidthPercent()//設置彈窗寬度占屏幕寬度的百分比(取值范圍0-1.0)

.setMaxWidth()//設置彈窗最大寬度(單位px)

? ? ? .setHeight()//設置彈窗高度(單位px)

.setHeightWrap()//設置彈窗高為內容包裹

? ? ? .setHeightMatch()//設置彈窗高為填充屏幕

.setHeightPercent()//設置彈窗寬度占屏幕高度的百分比(取值范圍0-1.0)

? ? ? .setMaxHeight()//設置彈窗最大高度(單位px)

? ? ? .setX()//設置彈窗的橫坐標

.setY()//設置彈窗的縱坐標

? ? ? .setPopupFromBottom()//設置彈窗從底部彈窗,并且沉在底部(仿MIUI)

? ? ? .setPopupFromTop()//設置彈窗從頂部彈窗,并且浮在頂部

? ? ? .setCancel()//設置彈窗是否可被取消

.setCancelOutside()//設置彈窗是否可點擊外部空間后消失

? ? ? .setAutoDismissTime()//設置彈窗自動消失時間

? ? ? .setAnimatStyle()//設置彈窗的出現消失動畫

? ? ? .setTag()//設置TAG

? ? ? .addOnCancelListener()//添加彈窗取消監聽

.addOnDismissListener()//添加彈窗消失監聽

? ? ? .addOnShowListener()//添加彈窗顯示監聽

? ? ? .show();? ? //顯示

dialog.dismiss();//隱藏

LoadingDialog

LoadingDialog dialog = new LoadingDialog(this);

dialog.setLodingText("加載中...")//設置加載文字

? ? ? ? ? .show();

NormalDialog

NormalDialog dialog = new NormalDialog(this);

dialog

//? ? ? ? ? ? .setCustomView(NormalDialog.LAYOUT_XQ)? ? ? //默認布局方案

//? ? ? ? ? ? .setCustomView(NormalDialog.LAYOUT_METERAIL)//Meterail布局方案

//? ? ? ? ? ? .setCustomView(R.layout.yourlayout)? ? //設置你自己的布局方案

? ? ? ? ? ? .setIcon(0)? ? ? ? //設置圖標,支持GIF圖片

? ? ? ? ? ? .setTitle("標題")? //設置標題

? ? ? ? ? ? .setContent("內容") //設置內容

? ? ? ? ? ? .setPositiveText(NormalDialog.SURE) //設置確認文字

? ? ? ? ? ? .setPositiveListener(null)? //設置確認監聽

? ? ? ? ? ? .setNegativeText(NormalDialog.CANCLE)//設置取消文字

? ? ? ? ? ? .setNegativeListener(null)? //設置取消監聽

? ? ? ? ? ? .setNeutralText("其他")? ? //設置中立文字

? ? ? ? ? ? .setNeutralListener(null)? //設置中立監聽

//? ? ? ? ? ? .setData()//一個方法即可設置以上所有內容

? ? ? ? ? ? .show();

ImageDialog

ImageDialog dialog = new ImageDialog(this);//ImageDialog繼承于NormalDialog,可以使用NormalDialog的所有方法

dialog

//? ? ? ? ? ? .setCustomView(ImageDialog.LAYOUT_XQ)? ? ? //默認布局方案

//? ? ? ? ? ? .setCustomView(R.layout.yourlayout)? ? //設置你自己的布局方案

? ? ? ? ? ? .setIcon(0) //設置圖標,支持GIF圖片

? ? ? ? ? ? .setTitle("標題") //設置標題

? ? ? ? ? ? .setContent("內容") //設置內容

? ? ? ? ? ? .setPositiveText(NormalDialog.SURE) //設置確認文字

? ? ? ? ? ? .setPositiveListener(null) //設置確認監聽

? ? ? ? ? ? .setNegativeText(NormalDialog.CANCLE)//設置取消文字

? ? ? ? ? ? .setNegativeListener(null) //設置取消監聽

? ? ? ? ? ? .setNeutralText("其他") //設置中立文字

? ? ? ? ? ? .setNeutralListener(null) //設置中立監聽

//? ? ? ? ? .setImageRes()? //設置大圖的資源ID,與下方法不要同時使用

? ? ? ? ? ? .setImageUrl("http://t2.hddhhn.com/uploads/tu/201610/198/hkgip2b102z.jpg")? //設置大圖的路徑地址,支持本地圖片的同時也支持網絡圖片,與上方法不要同時使用

//? ? ? ? ? .setData()//一個方法即可設置以上所有內容

//? ? ? ? ? .setDialogImageLoder()? //建議使用Glide或者其他圖片加載器加載圖片,默認加載器不提供三級緩存

? ? ? ? ? ? .show();

ProgressDialog

? ? ? ? ProgressDialog dialog = new ProgressDialog(this); //ProgressDialog與NormalDialog均繼承于SimpleDialog,因此均可設置title,icon,content等屬性

dialog

//? ? ? ? ? ? .setCustomView(ProgressDialog.LAYOUT_XQ)? ? ? //默認布局方案

//? ? ? ? ? ? .setCustomView(ProgressDialog.LAYOUT_METERAIL)? ? ? //Meterail布局方案

//? ? ? ? ? ? .setCustomView(R.layout.yourlayout)? ? //設置你自己的布局方案

? ? ? ? ? ? .setIcon(0)? ? ? ? //設置圖標,支持GIF圖片

? ? ? ? ? ? .setTitle("標題")? //設置標題

? ? ? ? ? ? .setContent("內容") //設置內容? ? ? ? ? ? ?

? ? ? ? ? ? .setProgress(50)? ? ? //設置進度值(范圍0-100)

//? ? ? ? ? ? ? ? .setProgress(50,"正在刪除 /System 文件夾中")//設置進度值+進度描述字符串

? ? ? ? ? ? .show();

待完善ListDialog與EditDialog

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容