Kongzue Dialog V3 現已開放測試

Kongzue Dialog V3

獻給要求安卓照著蘋果設計稿做開發的產品們(手動滑稽

Github

https://github.com/kongzue/DialogV3

Kongzue Dialog V3

Kongzue Dialog V3 的優勢

1,不會發生 WindowLeaked 錯誤

一般情況下直接創建的 Dialog 或 AlertDialog 啟動后,一旦其依賴的 Activity 優先于 Dialog 關閉,則會拋出 android.view.WindowLeaked 錯誤。

這對于普通對話框還好處理,只需要在 Activity 的 onPause() 或 onDestroy() 中對 dialog.dismiss(); 但對于可能出現的,諸如等待提示框、提醒框等 Dialog,很容易發生此問題。

Google 現已推薦使用 DialogFragment 來代替普通 Dialog 使用。

Kongzue Dialog 組件 V3 全部采用 DialogFragment 來實現對話框組件,且創造對話框更為簡單方便,只需簡單配置即可上手,也不會出現 WindowLeaked 錯誤。

2,橫豎屏切換、分屏大小切換、甚至未來的折疊屏,都沒有問題!

已知 Android 系統在發生橫豎屏切換、分屏大小切換、未來的折疊屏、窗口化等界面大小發生變化的情況時若不進行處理一般都會銷毀當前 Activity 重新創建,但這會導致我們已經彈出的 Dialog 也發生重啟。

重啟最大的麻煩在于需要對重啟后的 Dialog 進行原狀態恢復,即事件重綁定,包括 Dialog 的樣式、相關事件監聽器等都需要重新設置,使用 Kongzue Dialog V3 您就不需要再擔心這些麻煩的問題,Kongzue Dialog V3 會自動重建被銷毀的 Dialog,而無需您做任何處理。

3,目前市面上最像 iOS 風格的對話框組件

Kongzue Dialog V3 依然會像第二代一樣提供多種主題風格選擇,且更為強大,iOS 風格自帶高斯模糊讓您再也無需擔心產品經理和設計師放飛自我。

功能強大且真正的實時高斯模糊效果讓您的程序更具逼格,同時我們也比蘋果更早提供了 iOS 風格對話框夜間模式,若您正在使用暗色的程序設計,這款與您更搭!

我們的組件也會提供許許多多的接口供您自定義對話框的每一點細節,方便而快捷,迅速構建您的程序。

4,模態化

Kongzue Dialog V3 默認即支持模態化窗口模式,即即便從代碼一次執行顯示多個對話框,實際也會再上一個對話框消失后再顯示下一個,以避免對話框疊加造成的混亂情況發生。

Demo

現已提供 Kongzue Dialog V3 Demo 演示程序供下載體驗: https://fir.im/DialogV3

引入

? 當前 V3 庫處于 beta 測試階段,如果需要穩定版本請前往 Kongzue Dialog V2

Maven倉庫:

<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 升級至 Kongzue Dialog V3,請參考 Kongzue Dialog V2升級注意事項

配置

在完成引入 Kongzue Dialog V3 庫后,首先需要進行一些預先配置,諸如對話框組件整體的風格、主題和字體等,它們都可以在一個工具類中進行配置,說明如下:

import com.kongzue.dialog.util.DialogSettings;

DialogSettings.isUseBlur = (boolean);               //是否開啟模糊效果,默認關閉
DialogSettings.style = (DialogSettings.STYLE);      //全局主題風格,提供三種可選風格,STYLE_MATERIAL, STYLE_KONGZUE, STYLE_IOS
DialogSettings.theme = (DialogSettings.THEME);      //全局明暗風格,提供兩種可選主題,LIGHT, DARK
DialogSettings.titleTextInfo = (TextInfo);          //全局標題文字樣式
DialogSettings.contentTextInfo = (TextInfo);        //全局正文文字樣式
DialogSettings.buttonTextInfo = (TextInfo);         //全局默認按鈕文字樣式
DialogSettings.buttonPositiveTextInfo = (TextInfo); //全局焦點按鈕文字樣式(一般指確定按鈕)
DialogSettings.inputInfo = (InputInfo);             //全局輸入框文本樣式
DialogSettings.backgroundColor = (ColorInt);        //全局對話框背景顏色,值0時不生效
DialogSettings.cancelable = (boolean);              //全局對話框默認是否可以點擊外圍遮罩區域或返回鍵關閉,此開關不影響提示框(TipDialog)以及等待框(TipDialog)
DialogSettings.cancelableTipDialog = (boolean);     //全局提示框及等待框(WaitDialog、TipDialog)默認是否可以關閉
DialogSettings.DEBUGMODE = (boolean);               //是否允許打印日志
DialogSettings.blurAlpha = (int);                   //開啟模糊后的透明度(0~255)

如果需要開啟模糊效果,即 DialogSettings.isUseBlur = true; 需要進行額外 renderscript 配置,需要注意的是在部分低配置手機上此功能效率可能存在問題。

在 app 的 build.gradle 中添加以下代碼:

android {
    ...
    defaultConfig {
        ...

        renderscriptTargetApi 19
        renderscriptSupportModeEnabled true
    }
}

上述配置為全局配置,即在不進行特意定制的情況下,所有對話框組件默認按照此配置顯示,如有特殊需求,可以通過各對話框組件的 build(...) 方法創建對話框后進行配置,最后使用 show() 方法執行顯示即可。

使用

基本消息對話框

提供日常消息展示,區分為單按鈕、雙按鈕和三按鈕的效果。

消息對話框

以下范例通過參數快速創建一個基本的消息對話框:

MessageDialog.show(MainActivity.this, "提示", "這是一條消息", "確定");

額外的,MessageDialog 還提供多種參數的構建方法,方便快速創建合適的對話框:

MessageDialog.show(MainActivity.this, "提示", "這是一條雙按鈕消息", "確定", "取消");

MessageDialog.show(MainActivity.this, "提示", "這是一條三按鈕消息", "確定", "取消", "其他");

消息對話框的按鈕回調方法提供了一個 return 值用于判斷點擊按鈕后是否需要關閉對話框,默認 return false 會關閉當前的輸入對話框,若 return true 則點擊該按鈕后不會關閉:

MessageDialog.show(MainActivity.this, "更多功能", "點擊左邊的按鈕是無法關掉此對話框的,Kongzue Dialog提供的回調函數可以輕松幫你實現你想要的判斷功能", "點我關閉", "我是關不掉的")
        .setOnCancelButtonClickListener(new OnDialogButtonClickListener() {
            @Override
            public boolean onClick(BaseDialog baseDialog, View v) {
                return true;                    //位于“取消”位置的按鈕點擊后無法關閉對話框
            }
        });

此功能便于做選擇判斷,在合理的事件觸發后可允許關閉對話框。

也可以通過 build(...) 方法創建,并定制更多效果:

MessageDialog.build(MainActivity.this)
        .setStyle(DialogSettings.STYLE.STYLE_MATERIAL)
        .setTheme(DialogSettings.THEME.DARK)
        .setTitle("定制化對話框")
        .setMessage("我是內容")
        .setOkButton("OK", new OnDialogButtonClickListener() {
            @Override
            public boolean onClick(View v) {
                Toast.makeText(MainActivity.this, "點擊了OK!", Toast.LENGTH_SHORT).show();
                return false;
            }
        })
        .show();

需注意的是,只有修改主題風格的 setStyle(...) 和 setTheme(...) 方法必須在使用 build(...) 創建時才可以修改。

一些特殊需求中可能用到需要縱向排列按鈕的三按鈕消息框,則可以通過以下方法實現:

MessageDialog
        .show(MainActivity.this, "縱向排列", "如果你正在使用iOS風格或Kongzue風格,這里的按鈕可以縱向排列,以方便提供更多選擇", "還不錯", "有點意思", "還有呢?")
        .setButtonOrientation(LinearLayout.VERTICAL);

輸入對話框

提供額外輸入需求的對話框組件,可控制輸入內容類型,并在點擊按鈕時判斷是否關閉對話框。

輸入對話框

以下范例通過參數快速創建一個基本的輸入對話框:

InputDialog.show(MainActivity.this, "輸入對話框", "輸入一些內容", "確定");

InputDialog 與 MessageDialog 類似也提供多種構建方法,在此不再贅述。

輸入對話框的按鈕回調中會直接返回當前輸入的文本內容:

InputDialog.show(MainActivity.this, "提示", "請輸入密碼", "確定", "取消")
        .setOnOkButtonClickListener(new OnInputDialogButtonClickListener() {
            @Override
            public boolean onClick(BaseDialog baseDialog, View v, String inputStr) {
                //inputStr 即當前輸入的文本
                return false;
            }
        })

如果需要修改輸入框的提示語(HintText)或內容(InputText),可以使用以下方法:

InputDialog.show(MainActivity.this, "輸入對話框", "輸入一些內容", "確定")
        .setInputText("123456")
        .setHintText("請輸入密碼")
;

如需控制輸入內容的字號、顏色、輸入長度、文本類型,可以通過以下方法實現:

InputDialog.show(MainActivity.this, "輸入對話框", "請輸入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)類提供了基礎的輸入文字類型控制。

等待和提示對話框

等待提示對話框提供居中于屏幕阻斷操作的等待和狀態提示功能。

等待和提示對話框

使用以下代碼構建等待對話框:

WaitDialog.show(MainActivity.this, "請稍候...");

使用以下代碼構建提示對話框:

TipDialog.show(MainActivity.this, "警告提示", TipDialog.TYPE.WARNING);

TipDialog 自帶三種類型的提示圖標(TipDialog.TYPE),可通過參數設置指定:

TipDialog.TYPE.SUCCESS                                  //對勾提示圖
TipDialog.TYPE.WARNING                                  //感嘆號提示圖
TipDialog.TYPE.ERROR                                    //錯誤叉提示圖

也可以通過如下代碼設置自定義的圖片:

TipDialog.show(MainActivity.this, "警告提示", R.mipmap.img_tip);        //入參自定義圖片資源文件

額外的,可以通過以下語句設置 TipDialog 自動關閉的時長(單位:毫秒):

TipDialog.show(MainActivity.this, "成功!", TipDialog.TYPE.SUCCESS)
        .setTipTime(5000);

如果連續使用,兩者會有銜接的效果。

如需手動關閉,執行對應的 dismiss() 方法即可。

需要注意的是,WaitDialog 本質上繼承自 TipDialog,它們屬于長時間提示功能的組件,且內存中只會創建一次,不會重復創建直到被 dismiss() 關閉,但因為該組件使用 DialogFragment 構建,請勿需擔心造成 WindowLeaked 錯誤問題。

另外注意 WaitDialog 和 TipDialog 的主題和全局主題(DialogSettings.theme)是相反的,即對話框處于亮色模式時等待和提示對話框是暗色模式的,可以通過以下代碼自定義:

WaitDialog.show(MainActivity.this, null)
        .setTheme(DialogSettings.THEME.LIGHT);      //強制指定為亮色模式

底部菜單

即從屏幕底部彈出的可選擇的菜單。

底部菜單

使用以下代碼構建底部菜單:

BottomMenu.show(MainActivity.this, new String[]{"菜單1", "菜單2", "菜單3"}, new OnMenuItemClickListener() {
    @Override
    public void onClick(String text, int index) {
        //返回參數 text 即菜單名稱,index 即菜單索引
    }
});

BottomMenu 可以通過 String[] 集合創建,也可以通過 List<String> 創建。

要為底部菜單加上標題,可以使用一下語句:

BottomMenu.show(MainActivity.this, new String[]{"菜單1", "菜單2", "菜單3"}, new OnMenuItemClickListener() {
    @Override
    public void onClick(String text, int index) {
        log("點擊了:" + text);
    }
})
.setTitle("這里是標題文字");

通知

這里的通知并非系統通知,且不具備在您的設備通知欄中持久顯示的特性,它本質上是通過對 Toast 進行修改實現的跨界面屏幕頂部提示條。

不依賴于界面顯示,也不會打斷用戶操作,可作為即時通迅 IM 類軟件跨界面消息提醒,或者用于網絡錯誤狀態提示。

通知

使用以下代碼快速構建通知:

Notification.show(MainActivity.this, "提示", "提示信息");

需要加入圖標與點擊、關閉事件:

Notification.show(MainActivity.this, "提示", "提示信息", R.mipmap.ico_wechat).setOnNotificationClickListener(new OnNotificationClickListener() {
    @Override
    public void onClick() {
        MessageDialog.show(MainActivity.this, "提示", "點擊了消息");
    }
}).setOnDismissListener(new OnDismissListener() {
    @Override
    public void onDismiss() {
        log("消息溜走了");
    }
});

定制化

自定義布局

對于任意一個對話框組件,Kongzue Dialog V3 提供了自定義布局功能,您可以使用一下代碼來插入自定義布局:

//對于未實例化的布局:
MessageDialog.show(MainActivity.this, "提示", "這個窗口附帶自定義布局", "知道了")
        .setCustomView(R.layout.layout_custom, new MessageDialog.OnBindView() {
            @Override
            public void onBind(MessageDialog dialog, View v) {
                //綁定布局事件,可使用v.findViewById(...)來獲取子組件
                v.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        toast("點擊了自定義布局");
                    }
                });
            }
        });
        
//對于已實例化的布局:
View customView;
MessageDialog.show(MainActivity.this, "提示", "這個窗口附帶自定義布局", "知道了")
        .setCustomView(customView);

目前支持自定義子布局的有:消息對話框組件(MessageDialog)、底部菜單組件(BottomDialog)、輸入框組件(InputDialog)和通知組件(Notification)

自定義對話框

Kongzue Dialog V3 提供了完全自定義對話框方便快速實現特殊效果的對話框樣式。

自定義對話框

使用以下代碼創建自定義對話框:

//對于未實例化的布局:
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();
            }
        });
    }
});

//對于已實例化的布局:
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();
            }
        });
    }
});

一些建議

由于采用了模態化的對話框展示模式、等待提示框延時關閉以及事件重綁定等技術,可能會被某些 BUG 檢測軟件定性為“內存泄漏”的問題,但實際并不會引發任何崩潰和錯誤,如有不放心可以在您的程序退出時通過以下語句徹底清空所有 Kongzue Dialog V3 使用的內存句柄:

BaseDialog.unload();

開源協議

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.

更新日志:

內測階段。

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

推薦閱讀更多精彩內容