Kongzue Dialog V3
獻(xiàn)給要求安卓照著蘋果設(shè)計(jì)稿做開發(fā)的產(chǎn)品們(手動(dòng)滑稽
Github
https://github.com/kongzue/DialogV3
Kongzue Dialog V3 的優(yōu)勢(shì)
1,不會(huì)發(fā)生 WindowLeaked 錯(cuò)誤
一般情況下直接創(chuàng)建的 Dialog 或 AlertDialog 啟動(dòng)后漆魔,一旦其依賴的 Activity 優(yōu)先于 Dialog 關(guān)閉凤薛,則會(huì)拋出 android.view.WindowLeaked 錯(cuò)誤销斟。
這對(duì)于普通對(duì)話框還好處理,只需要在 Activity 的 onPause() 或 onDestroy() 中對(duì) dialog.dismiss(); 但對(duì)于可能出現(xiàn)的饿幅,諸如等待提示框、提醒框等 Dialog,很容易發(fā)生此問題捅彻。
Google 現(xiàn)已推薦使用 DialogFragment 來(lái)代替普通 Dialog 使用。
Kongzue Dialog 組件 V3 全部采用 DialogFragment 來(lái)實(shí)現(xiàn)對(duì)話框組件鞍陨,且創(chuàng)造對(duì)話框更為簡(jiǎn)單方便步淹,只需簡(jiǎn)單配置即可上手,也不會(huì)出現(xiàn) WindowLeaked 錯(cuò)誤诚撵。
2缭裆,橫豎屏切換、分屏大小切換寿烟、甚至未來(lái)的折疊屏澈驼,都沒有問題!
已知 Android 系統(tǒng)在發(fā)生橫豎屏切換筛武、分屏大小切換缝其、未來(lái)的折疊屏、窗口化等界面大小發(fā)生變化的情況時(shí)若不進(jìn)行處理一般都會(huì)銷毀當(dāng)前 Activity 重新創(chuàng)建徘六,但這會(huì)導(dǎo)致我們已經(jīng)彈出的 Dialog 也發(fā)生重啟内边。
重啟最大的麻煩在于需要對(duì)重啟后的 Dialog 進(jìn)行原狀態(tài)恢復(fù),即事件重綁定待锈,包括 Dialog 的樣式漠其、相關(guān)事件監(jiān)聽器等都需要重新設(shè)置,使用 Kongzue Dialog V3 您就不需要再擔(dān)心這些麻煩的問題炉擅,Kongzue Dialog V3 會(huì)自動(dòng)重建被銷毀的 Dialog辉懒,而無(wú)需您做任何處理。
3谍失,目前市面上最像 iOS 風(fēng)格的對(duì)話框組件
Kongzue Dialog V3 依然會(huì)像第二代一樣提供多種主題風(fēng)格選擇眶俩,且更為強(qiáng)大,iOS 風(fēng)格自帶高斯模糊讓您再也無(wú)需擔(dān)心產(chǎn)品經(jīng)理和設(shè)計(jì)師放飛自我快鱼。
功能強(qiáng)大且真正的實(shí)時(shí)高斯模糊效果讓您的程序更具逼格颠印,同時(shí)我們也比蘋果更早提供了 iOS 風(fēng)格對(duì)話框夜間模式,若您正在使用暗色的程序設(shè)計(jì)抹竹,這款與您更搭线罕!
我們的組件也會(huì)提供許許多多的接口供您自定義對(duì)話框的每一點(diǎn)細(xì)節(jié),方便而快捷窃判,迅速構(gòu)建您的程序钞楼。
4,模態(tài)化
Kongzue Dialog V3 默認(rèn)即支持模態(tài)化窗口模式袄琳,即即便從代碼一次執(zhí)行顯示多個(gè)對(duì)話框询件,實(shí)際也會(huì)再上一個(gè)對(duì)話框消失后再顯示下一個(gè)燃乍,以避免對(duì)話框疊加造成的混亂情況發(fā)生。
Demo
現(xiàn)已提供 Kongzue Dialog V3 Demo 演示程序供下載體驗(yàn): https://fir.im/DialogV3
引入
? 當(dāng)前 V3 庫(kù)處于 beta 測(cè)試階段宛琅,如果需要穩(wěn)定版本請(qǐng)前往 Kongzue Dialog V2
Maven倉(cāng)庫(kù):
<dependency>
<groupId>com.kongzue.dialog_v3</groupId>
<artifactId>dialog</artifactId>
<version>2.9.9.8</version>
<type>pom</type>
</dependency>
Gradle:
在dependencies{}中添加引用:
implementation 'com.kongzue.dialog_v3:dialog:2.9.9.8'
從 Kongzue Dialog V2 升級(jí)至 Kongzue Dialog V3刻蟹,請(qǐng)參考 Kongzue Dialog V2升級(jí)注意事項(xiàng)
配置
在完成引入 Kongzue Dialog V3 庫(kù)后,首先需要進(jìn)行一些預(yù)先配置嘿辟,諸如對(duì)話框組件整體的風(fēng)格舆瘪、主題和字體等,它們都可以在一個(gè)工具類中進(jìn)行配置红伦,說明如下:
import com.kongzue.dialog.util.DialogSettings;
DialogSettings.isUseBlur = (boolean); //是否開啟模糊效果英古,默認(rèn)關(guān)閉
DialogSettings.style = (DialogSettings.STYLE); //全局主題風(fēng)格,提供三種可選風(fēng)格色建,STYLE_MATERIAL, STYLE_KONGZUE, STYLE_IOS
DialogSettings.theme = (DialogSettings.THEME); //全局明暗風(fēng)格哺呜,提供兩種可選主題舌缤,LIGHT, DARK
DialogSettings.titleTextInfo = (TextInfo); //全局標(biāo)題文字樣式
DialogSettings.contentTextInfo = (TextInfo); //全局正文文字樣式
DialogSettings.buttonTextInfo = (TextInfo); //全局默認(rèn)按鈕文字樣式
DialogSettings.buttonPositiveTextInfo = (TextInfo); //全局焦點(diǎn)按鈕文字樣式(一般指確定按鈕)
DialogSettings.inputInfo = (InputInfo); //全局輸入框文本樣式
DialogSettings.backgroundColor = (ColorInt); //全局對(duì)話框背景顏色箕戳,值0時(shí)不生效
DialogSettings.cancelable = (boolean); //全局對(duì)話框默認(rèn)是否可以點(diǎn)擊外圍遮罩區(qū)域或返回鍵關(guān)閉,此開關(guān)不影響提示框(TipDialog)以及等待框(TipDialog)
DialogSettings.cancelableTipDialog = (boolean); //全局提示框及等待框(WaitDialog国撵、TipDialog)默認(rèn)是否可以關(guān)閉
DialogSettings.DEBUGMODE = (boolean); //是否允許打印日志
DialogSettings.blurAlpha = (int); //開啟模糊后的透明度(0~255)
如果需要開啟模糊效果陵吸,即 DialogSettings.isUseBlur = true; 需要進(jìn)行額外 renderscript 配置,需要注意的是在部分低配置手機(jī)上此功能效率可能存在問題介牙。
在 app 的 build.gradle 中添加以下代碼:
android {
...
defaultConfig {
...
renderscriptTargetApi 19
renderscriptSupportModeEnabled true
}
}
上述配置為全局配置壮虫,即在不進(jìn)行特意定制的情況下,所有對(duì)話框組件默認(rèn)按照此配置顯示环础,如有特殊需求囚似,可以通過各對(duì)話框組件的 build(...) 方法創(chuàng)建對(duì)話框后進(jìn)行配置,最后使用 show() 方法執(zhí)行顯示即可线得。
使用
基本消息對(duì)話框
提供日常消息展示饶唤,區(qū)分為單按鈕、雙按鈕和三按鈕的效果贯钩。
以下范例通過參數(shù)快速創(chuàng)建一個(gè)基本的消息對(duì)話框:
MessageDialog.show(MainActivity.this, "提示", "這是一條消息", "確定");
額外的募狂,MessageDialog 還提供多種參數(shù)的構(gòu)建方法,方便快速創(chuàng)建合適的對(duì)話框:
MessageDialog.show(MainActivity.this, "提示", "這是一條雙按鈕消息", "確定", "取消");
MessageDialog.show(MainActivity.this, "提示", "這是一條三按鈕消息", "確定", "取消", "其他");
消息對(duì)話框的按鈕回調(diào)方法提供了一個(gè) return 值用于判斷點(diǎn)擊按鈕后是否需要關(guān)閉對(duì)話框角雷,默認(rèn) return false 會(huì)關(guān)閉當(dāng)前的輸入對(duì)話框祸穷,若 return true 則點(diǎn)擊該按鈕后不會(huì)關(guān)閉:
MessageDialog.show(MainActivity.this, "更多功能", "點(diǎn)擊左邊的按鈕是無(wú)法關(guān)掉此對(duì)話框的,Kongzue Dialog提供的回調(diào)函數(shù)可以輕松幫你實(shí)現(xiàn)你想要的判斷功能", "點(diǎn)我關(guān)閉", "我是關(guān)不掉的")
.setOnCancelButtonClickListener(new OnDialogButtonClickListener() {
@Override
public boolean onClick(BaseDialog baseDialog, View v) {
return true; //位于“取消”位置的按鈕點(diǎn)擊后無(wú)法關(guān)閉對(duì)話框
}
});
此功能便于做選擇判斷勺三,在合理的事件觸發(fā)后可允許關(guān)閉對(duì)話框雷滚。
也可以通過 build(...) 方法創(chuàng)建,并定制更多效果:
MessageDialog.build(MainActivity.this)
.setStyle(DialogSettings.STYLE.STYLE_MATERIAL)
.setTheme(DialogSettings.THEME.DARK)
.setTitle("定制化對(duì)話框")
.setMessage("我是內(nèi)容")
.setOkButton("OK", new OnDialogButtonClickListener() {
@Override
public boolean onClick(View v) {
Toast.makeText(MainActivity.this, "點(diǎn)擊了OK吗坚!", Toast.LENGTH_SHORT).show();
return false;
}
})
.show();
需注意的是祈远,只有修改主題風(fēng)格的 setStyle(...) 和 setTheme(...) 方法必須在使用 build(...) 創(chuàng)建時(shí)才可以修改胯舷。
一些特殊需求中可能用到需要縱向排列按鈕的三按鈕消息框,則可以通過以下方法實(shí)現(xiàn):
MessageDialog
.show(MainActivity.this, "縱向排列", "如果你正在使用iOS風(fēng)格或Kongzue風(fēng)格绊含,這里的按鈕可以縱向排列桑嘶,以方便提供更多選擇", "還不錯(cuò)", "有點(diǎn)意思", "還有呢?")
.setButtonOrientation(LinearLayout.VERTICAL);
輸入對(duì)話框
提供額外輸入需求的對(duì)話框組件躬充,可控制輸入內(nèi)容類型逃顶,并在點(diǎn)擊按鈕時(shí)判斷是否關(guān)閉對(duì)話框。
以下范例通過參數(shù)快速創(chuàng)建一個(gè)基本的輸入對(duì)話框:
InputDialog.show(MainActivity.this, "輸入對(duì)話框", "輸入一些內(nèi)容", "確定");
InputDialog 與 MessageDialog 類似也提供多種構(gòu)建方法充甚,在此不再贅述以政。
輸入對(duì)話框的按鈕回調(diào)中會(huì)直接返回當(dāng)前輸入的文本內(nèi)容:
InputDialog.show(MainActivity.this, "提示", "請(qǐng)輸入密碼", "確定", "取消")
.setOnOkButtonClickListener(new OnInputDialogButtonClickListener() {
@Override
public boolean onClick(BaseDialog baseDialog, View v, String inputStr) {
//inputStr 即當(dāng)前輸入的文本
return false;
}
})
如果需要修改輸入框的提示語(yǔ)(HintText)或內(nèi)容(InputText),可以使用以下方法:
InputDialog.show(MainActivity.this, "輸入對(duì)話框", "輸入一些內(nèi)容", "確定")
.setInputText("123456")
.setHintText("請(qǐng)輸入密碼")
;
如需控制輸入內(nèi)容的字號(hào)伴找、顏色盈蛮、輸入長(zhǎng)度、文本類型技矮,可以通過以下方法實(shí)現(xiàn):
InputDialog.show(MainActivity.this, "輸入對(duì)話框", "請(qǐng)輸入6位密碼", "確定")
.setInputInfo(new InputInfo()
.setMAX_LENGTH(6)
.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD)
.setTextInfo(new TextInfo()
.setFontColor(Color.RED)
)
)
;
備注:TextInfo(com.kongzue.dialog.util.TextInfo)類提供了基本的文字樣式控制抖誉,InputInfo(com.kongzue.dialog.util.InputInfo)類提供了基礎(chǔ)的輸入文字類型控制。
等待和提示對(duì)話框
等待提示對(duì)話框提供居中于屏幕阻斷操作的等待和狀態(tài)提示功能衰倦。
使用以下代碼構(gòu)建等待對(duì)話框:
WaitDialog.show(MainActivity.this, "請(qǐng)稍候...");
使用以下代碼構(gòu)建提示對(duì)話框:
TipDialog.show(MainActivity.this, "警告提示", TipDialog.TYPE.WARNING);
TipDialog 自帶三種類型的提示圖標(biāo)(TipDialog.TYPE)袒炉,可通過參數(shù)設(shè)置指定:
TipDialog.TYPE.SUCCESS //對(duì)勾提示圖
TipDialog.TYPE.WARNING //感嘆號(hào)提示圖
TipDialog.TYPE.ERROR //錯(cuò)誤叉提示圖
也可以通過如下代碼設(shè)置自定義的圖片:
TipDialog.show(MainActivity.this, "警告提示", R.mipmap.img_tip); //入?yún)⒆远x圖片資源文件
額外的,可以通過以下語(yǔ)句設(shè)置 TipDialog 自動(dòng)關(guān)閉的時(shí)長(zhǎng)(單位:毫秒):
TipDialog.show(MainActivity.this, "成功樊零!", TipDialog.TYPE.SUCCESS)
.setTipTime(5000);
如果連續(xù)使用我磁,兩者會(huì)有銜接的效果。
如需手動(dòng)關(guān)閉驻襟,執(zhí)行對(duì)應(yīng)的 dismiss() 方法即可夺艰。
需要注意的是,WaitDialog 本質(zhì)上繼承自 TipDialog沉衣,它們屬于長(zhǎng)時(shí)間提示功能的組件郁副,且內(nèi)存中只會(huì)創(chuàng)建一次,不會(huì)重復(fù)創(chuàng)建直到被 dismiss() 關(guān)閉厢蒜,但因?yàn)樵摻M件使用 DialogFragment 構(gòu)建霞势,請(qǐng)勿需擔(dān)心造成 WindowLeaked 錯(cuò)誤問題。
另外注意 WaitDialog 和 TipDialog 的主題和全局主題(DialogSettings.theme)是相反的斑鸦,即對(duì)話框處于亮色模式時(shí)等待和提示對(duì)話框是暗色模式的愕贡,可以通過以下代碼自定義:
WaitDialog.show(MainActivity.this, null)
.setTheme(DialogSettings.THEME.LIGHT); //強(qiáng)制指定為亮色模式
底部菜單
即從屏幕底部彈出的可選擇的菜單。
使用以下代碼構(gòu)建底部菜單:
BottomMenu.show(MainActivity.this, new String[]{"菜單1", "菜單2", "菜單3"}, new OnMenuItemClickListener() {
@Override
public void onClick(String text, int index) {
//返回參數(shù) text 即菜單名稱巷屿,index 即菜單索引
}
});
BottomMenu 可以通過 String[] 集合創(chuàng)建固以,也可以通過 List<String> 創(chuàng)建。
要為底部菜單加上標(biāo)題,可以使用一下語(yǔ)句:
BottomMenu.show(MainActivity.this, new String[]{"菜單1", "菜單2", "菜單3"}, new OnMenuItemClickListener() {
@Override
public void onClick(String text, int index) {
log("點(diǎn)擊了:" + text);
}
})
.setTitle("這里是標(biāo)題文字");
通知
這里的通知并非系統(tǒng)通知憨琳,且不具備在您的設(shè)備通知欄中持久顯示的特性诫钓,它本質(zhì)上是通過對(duì) Toast 進(jìn)行修改實(shí)現(xiàn)的跨界面屏幕頂部提示條。
不依賴于界面顯示篙螟,也不會(huì)打斷用戶操作菌湃,可作為即時(shí)通迅 IM 類軟件跨界面消息提醒,或者用于網(wǎng)絡(luò)錯(cuò)誤狀態(tài)提示遍略。
使用以下代碼快速構(gòu)建通知:
Notification.show(MainActivity.this, "提示", "提示信息");
需要加入圖標(biāo)與點(diǎn)擊惧所、關(guān)閉事件:
Notification.show(MainActivity.this, "提示", "提示信息", R.mipmap.ico_wechat).setOnNotificationClickListener(new OnNotificationClickListener() {
@Override
public void onClick() {
MessageDialog.show(MainActivity.this, "提示", "點(diǎn)擊了消息");
}
}).setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
log("消息溜走了");
}
});
定制化
自定義布局
對(duì)于任意一個(gè)對(duì)話框組件,Kongzue Dialog V3 提供了自定義布局功能绪杏,您可以使用一下代碼來(lái)插入自定義布局:
//對(duì)于未實(shí)例化的布局:
MessageDialog.show(MainActivity.this, "提示", "這個(gè)窗口附帶自定義布局", "知道了")
.setCustomView(R.layout.layout_custom, new MessageDialog.OnBindView() {
@Override
public void onBind(MessageDialog dialog, View v) {
//綁定布局事件下愈,可使用v.findViewById(...)來(lái)獲取子組件
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toast("點(diǎn)擊了自定義布局");
}
});
}
});
//對(duì)于已實(shí)例化的布局:
View customView;
MessageDialog.show(MainActivity.this, "提示", "這個(gè)窗口附帶自定義布局", "知道了")
.setCustomView(customView);
目前支持自定義子布局的有:消息對(duì)話框組件(MessageDialog)、底部菜單組件(BottomDialog)蕾久、輸入框組件(InputDialog)和通知組件(Notification)
自定義對(duì)話框
Kongzue Dialog V3 提供了完全自定義對(duì)話框方便快速實(shí)現(xiàn)特殊效果的對(duì)話框樣式势似。
使用以下代碼創(chuàng)建自定義對(duì)話框:
//對(duì)于未實(shí)例化的布局:
CustomDialog.show(MainActivity.this, R.layout.layout_custom_dialog, new CustomDialog.OnBindView() {
@Override
public void onBind(final CustomDialog dialog, View v) {
ImageView btnOk = v.findViewById(R.id.btn_ok);
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.doDismiss();
}
});
}
});
//對(duì)于已實(shí)例化的布局:
View customView;
CustomDialog.show(MainActivity.this, customView, new CustomDialog.OnBindView() {
@Override
public void onBind(final CustomDialog dialog, View v) {
ImageView btnOk = v.findViewById(R.id.btn_ok);
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.doDismiss();
}
});
}
});
一些建議
由于采用了模態(tài)化的對(duì)話框展示模式、等待提示框延時(shí)關(guān)閉以及事件重綁定等技術(shù)僧著,可能會(huì)被某些 BUG 檢測(cè)軟件定性為“內(nèi)存泄漏”的問題履因,但實(shí)際并不會(huì)引發(fā)任何崩潰和錯(cuò)誤,如有不放心可以在您的程序退出時(shí)通過以下語(yǔ)句徹底清空所有 Kongzue Dialog V3 使用的內(nèi)存句柄:
BaseDialog.unload();
開源協(xié)議
Copyright Kongzue Dialog
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
更新日志:
內(nèi)測(cè)階段霹抛。