# DialogUtilsLib **Repository Path**: osard/DialogUtilsLib ## Basic Information - **Project Name**: DialogUtilsLib - **Description**: 替换系统dialog风格后的通用提示框工具类,可以覆盖lib下的定义资源,改变现有的颜色风格,需要改变布局风格,可下载项目后自行调整。 - **Primary Language**: Android - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://github.com/osplugin/DialogUtilsLib - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 1 - **Created**: 2021-07-29 - **Last Updated**: 2025-08-25 ## Categories & Tags **Categories**: android-modules **Tags**: Android, dialog, Java ## README # DialogUtilsApp [![License](https://img.shields.io/badge/License%20-Apache%202-337ab7.svg)](https://www.apache.org/licenses/LICENSE-2.0) [![API](https://img.shields.io/badge/API-21%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=21) [![](https://jitpack.io/v/com.github.osplugin/DialogUtilsLib.svg)](https://jitpack.io/#com.github.osplugin/DialogUtilsLib) ### 一、介绍 替换系统dialog风格后的通用提示框工具类,可以覆盖lib下的定义资源,改变现有的颜色风格,需要改变布局风格,可参考文档覆盖属性 ### 二、工程引入工具包准备 **com.android.tools.build:gradle:4.2.2及以下版本,在工程的 build.gradle 文件添加** ``` allprojects { repositories { google() mavenCentral() //jitpack 仓库 maven { url 'https://jitpack.io' } } } ``` **com.android.tools.build:gradle:7.0.0及以上版本,在工程的 settings.gradle 文件添加** ``` dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() //jitpack 仓库 maven { url 'https://jitpack.io' } } } ``` **APP的build.gradle文件添加** ``` dependencies { ... def dialog_version = 'x.x.x' //使用最新版本,下方lib二选一,不可同时使用,高SDK版本编译建议使用DialogFragmentUtilsLib,生命周期处理更好 implementation "com.github.osplugin.DialogUtilsLib:DialogUtilsLib:$dialog_version" implementation "com.github.osplugin.DialogUtilsLib:DialogFragmentUtilsLib:$dialog_version" //资源依赖 implementation 'com.google.android.material:material:1.3.0' } ``` **必须启用dataBinding** ``` android { buildFeatures { //启用数据绑定,MVVM dataBinding true } } ``` ### 三、使用 注意下方只做了基础展示,dialog的都会返回对应的utils对象,registerActivityLifecycleCallbacks方法设置后,activity销毁时会自动把显示在此activity上的dialog一起关闭。 - **application初始化设置** ```java public class App extends Application { @Override public void onCreate() { super.onCreate(); //初始化dialog工具类设置 DialogLibInitSetting.getInstance() //设置debug .setDebug(BuildConfig.DEBUG) //设置是否反转确定和取消按钮位置,默认:左确定,右取消;设置后:左取消,右确定 .setReverseButton(true) //注册全局activity生命周期监听 .registerActivityLifecycleCallbacks(this); } // **application** 下的此方法进行注册,且 **activity** 设置 **android:configChanges="orientation|keyboardHidden|screenSize"** 时, // 屏幕翻转不会销毁重建 **activity** ,注册的此方法,将会根据设置的横竖屏宽度比自动改变dialog的宽度大小。 @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); DialogLibInitSetting.getInstance().onScreenRotation(newConfig); } } ``` **特别提醒:** ``` /注册全局activity生命周期监听 .registerActivityLifecycleCallbacks(this) 和 DialogLibInitSetting.getInstance().onScreenRotation(newConfig); ``` 方法在 `DialogFragmentUtilsLib` 中不支持 - **普通dialog** ```java DialogLibCommon.create(this) .setMessage("普通对话框1") .setAlias("text1") .setPortraitWidthFactor(0.85F) .setLandscapeWidthFactor(0.5F) .setOnBtnMessage(() -> { //描述区域点击时触发 Toast.makeText(MainActivity.this, "点击了消息区域", Toast.LENGTH_SHORT).show(); }) .setOnBtnOk(() -> { Toast.makeText(MainActivity.this, "点击了确定按钮", Toast.LENGTH_SHORT).show(); }) .setOnBtnCancel(() -> { Toast.makeText(MainActivity.this, "点击了取消按钮", Toast.LENGTH_SHORT).show(); }) .setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }) .show(); ``` **特别提醒:** ``` .setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }) ``` 方法在 `DialogFragmentUtilsLib` 中不支持 - **自定义dialog** ```java ImageView imageView = new ImageView(this); imageView.setImageDrawable(getResources().getDrawable(R.mipmap.ic_launcher)); DialogLibCustom.create(this) .setPortraitWidthFactor(0.85F) .setLandscapeWidthFactor(0.5F) .setOnCustomBtnOk(() -> { Toast.makeText(MainActivity.this, "点击了确定按钮", Toast.LENGTH_SHORT).show(); return true; }) .setOnBtnCancel(() -> { Toast.makeText(MainActivity.this, "点击了取消按钮", Toast.LENGTH_SHORT).show(); }) .setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }) .setAlias("text2") .show(imageView); ``` **特别提醒:** ``` .setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }) ``` 方法在 `DialogFragmentUtilsLib` 中不支持 - **输入型dialog** ```java DialogLibInput.create(this) .setMessage("输入信息") .setAlias("text3") .setPortraitWidthFactor(0.85F) .setLandscapeWidthFactor(0.5F) //todo 设置显示密码隐藏/显示图片,由于输入类型限制不是密码,此处设置无效 .setShowLookPassword() //自动弹出键盘 .setPopupKeyboard() .setOnBtnCancel(() -> { Toast.makeText(MainActivity.this, "点击了取消按钮", Toast.LENGTH_SHORT).show(); }) .setOnBtnOk(str -> { Toast.makeText(MainActivity.this, "输入消息为:" + str, Toast.LENGTH_SHORT).show(); return true; }) .setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }) .show(); ``` **特别提醒:** ``` //自动弹出键盘 .setPopupKeyboard() 和 .setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }) ``` 方法在 `DialogFragmentUtilsLib` 中不支持 - **等待型dialog** ```java DialogLibLoading.create(this) //自动关闭时间,如需手动关闭,则保存此对象,在需要时调用 **dialogLibLoading.closeDialog()** .setTimeoutClose(2000) .setAlias("text4") .setOnLoading(() -> { Toast.makeText(MainActivity.this, "我是显示对话框前触发的", Toast.LENGTH_SHORT).show(); }) .setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }) .show(); ``` **特别提醒:** ``` .setOnLoading(() -> { Toast.makeText(MainActivity.this, "我是显示对话框前触发的,10秒后自动关闭", Toast.LENGTH_SHORT).show(); }) 和 .setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }) ``` 方法在 `DialogFragmentUtilsLib` 中不支持 - **完全自定义型dialog** ```java final DialogLibAllCustom dialog = DialogLibAllCustom.create(this) .setCancelable(true) .setPortraitWidthFactor(0.85F) .setLandscapeWidthFactor(0.5F) .setAlias("text5"); TextView view = new TextView(this); view.setBackgroundResource(R.color.purple_500); view.setTextColor(getResources().getColor(R.color.white)); view.setText("这是一个完全自定义布局的对话框,对话框显示后需要手动关闭"); view.setOnClickListener(v2 -> { dialog.closeDialog(); }); dialog.setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }); dialog.show(view); ``` **特别提醒:** ``` .setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }) ``` 方法在 `DialogFragmentUtilsLib` 中不支持 - **密码输入型dialog** ```java DialogLibInput.create(this) .setMessage("123") .setLength(6) .setPortraitWidthFactor(0.85F) .setLandscapeWidthFactor(0.5F) .setInputType(EditorInfo.TYPE_CLASS_NUMBER | EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD) .setAlias("text6") //设置显示密码隐藏/显示图片 .setShowLookPassword() //自动弹出键盘 .setPopupKeyboard() .setOnBtnCancel(() -> { Toast.makeText(MainActivity.this, "点击了取消按钮", Toast.LENGTH_SHORT).show(); }) .setOnBtnOk(str -> { Toast.makeText(MainActivity.this, "输入密码为:" + str, Toast.LENGTH_SHORT).show(); return true; }) .setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }) .show(); ``` **特别提醒:** ``` .setOnActivityLifecycleClose(() -> { Toast.makeText(MainActivity.this, "activity销毁而关闭", Toast.LENGTH_SHORT).show(); }) ``` 方法在 `DialogFragmentUtilsLib` 中不支持 - **Snackbar提示框** ```java SnackBarLib.make(binding.coordinator, "Snackbar提示框Snackbar提示框Snackbar提示框Snackbar提示框Snackbar提示框Snackbar提示框Snackbar提示框Snackbar提示框Snackbar提示框Snackbar提示框", 10 * 1000) .setContentColor(R.color.white) .setAction("action", v1 -> Toast.makeText(getApplicationContext(), "action的点击事件", Toast.LENGTH_SHORT).show()) .setActionClickCallback(tag -> { Toast.makeText(getApplicationContext(), "由点击action触发关闭", Toast.LENGTH_SHORT).show(); }) .showSuccess(); //或者使用默认风格,与系统默认Snackbar的属性书写习惯基本一致 SnackBarLib.makeShort(binding.text7,"Snackbar提示框").show(); //关闭已显示的SnackBar SnackBarLib.dismiss(); ``` - **PopupWindow提示** ```java //创建PopupWindowLib对象 final PopupWindowLib popupWindowLib = PopupWindowLib.create(); //创建PopupWindowLib内容布局 PopLayoutBinding plb = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.pop_layout, null, false); plb.setClick(vv -> { TextView tv = (TextView) vv; Toast.makeText(MainActivity.this, "点击了\"" + tv.getText() + "\"", Toast.LENGTH_SHORT).show(); popupWindowLib.dismiss(); }); //设置PopupWindowLib参数并显示 popupWindowLib .setOutsideTouchable(true) .setAttachedInDecor(true) .setFocusable(true) // .setContentView(plb.getRoot(), WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT) .setContentView(plb.getRoot(), binding.text8.getWidth(), 280) .setAutoCloseTime(8 * 1000) .showAsDropDown(binding.text8, 0, 20); ``` ### 四、资源覆盖,改变颜色、字体大小、默认文字 - **drawable下可覆盖资源及注释** ```html snackbar_lib_bg.xml SnackBarLib默认使用的背景 ``` **snackbar_lib_bg.xml,如果颜色替换了@color/snackbar_lib_bg,则colors下的snackbar_lib_bg属性覆盖将会失效** ```html ``` - **colors下可覆盖资源及注释** ```html #FFFFFF #000000 #000000 #2C9BF3 #000000 #FFFFFF #FFFFFF #EAEAEA #EAEAEA @color/dialog_all_default_bg @color/dialog_all_default_content_fg @color/dialog_all_default_title_fg @color/dialog_all_default_ok_fg @color/dialog_all_default_cancel_fg @color/dialog_all_default_ok_bg @color/dialog_all_default_cancel_bg @color/dialog_all_default_split_line_bg @color/dialog_all_default_button_split_line_bg @color/dialog_all_default_bg @color/dialog_all_default_title_fg @color/dialog_all_default_ok_fg @color/dialog_all_default_cancel_fg @color/dialog_all_default_ok_bg @color/dialog_all_default_cancel_bg @color/dialog_all_default_split_line_bg @color/dialog_all_default_button_split_line_bg @color/dialog_all_default_bg @color/dialog_all_default_title_fg @color/dialog_all_default_ok_fg @color/dialog_all_default_cancel_fg @color/dialog_all_default_ok_bg @color/dialog_all_default_cancel_bg @color/dialog_all_default_content_fg @color/dialog_all_default_split_line_bg @color/dialog_all_default_button_split_line_bg #FFC4C4C4 #FFFFFF #C4C4C4 #FFFFFF #2C9BF3 ``` - **dimens下资源** ```html 10dp 10dp 10dp 14sp 14sp 14sp 14sp @dimen/dialog_utils_lib_all_title_padding @dimen/dialog_utils_lib_all_content_padding @dimen/dialog_utils_lib_all_button_padding 14sp 14sp 14sp 14sp @dimen/dialog_utils_lib_all_title_padding @dimen/dialog_utils_lib_all_content_padding @dimen/dialog_utils_lib_all_button_padding 14sp 14sp 14sp @dimen/dialog_utils_lib_all_title_padding @dimen/dialog_utils_lib_all_content_padding @dimen/dialog_utils_lib_all_button_padding 14sp 14sp 14sp 30dp 10dp 10dp 0.85 0.65 ``` - **strings下资源定义,注意:如果你的项目存在多语言,则必须覆盖** ```html 确定 取消 提示 数据处理中… ``` - **mipmap下资源定义,png格式,可覆盖** ``` dialog_utils_lib_password_hide 隐藏图片命名 dialog_utils_lib_password_show 显示图片命名 ``` ``` snackbar_lib_default_success snackbar通过的默认图标 snackbar_lib_default_error snackbar错误的默认图标 snackbar_lib_default_info snackbar信息的默认图标 snackbar_lib_default_warn snackbar警告的默认图标 ``` - **integers下资源定义,可覆盖** ```html 2 ``` ### 五、预览 - **普通对话框** ![普通对话框](https://images.gitee.com/uploads/images/2021/0629/164213_9646f711_1021361.png "普通.png") - **自定义对话框** ![自定义对话框](https://images.gitee.com/uploads/images/2021/0629/164235_a87a557f_1021361.png "自定义.png") - **完全自定义对话框** ![完全自定义对话框](https://images.gitee.com/uploads/images/2021/0629/164251_3d768863_1021361.png "完全自定义.png") - **输入对话框** ![输入对话框](https://images.gitee.com/uploads/images/2021/0629/164307_101e5302_1021361.png "输入.png") - **等待对话框** ![等待对话框](https://images.gitee.com/uploads/images/2021/0629/164333_93867347_1021361.png "等待.png") - **密码输入显示密码时对话框** ![密码输入显示密码时对话框](https://images.gitee.com/uploads/images/2021/0629/164348_abd94487_1021361.png "密码显示.png") - **密码输入隐藏密码时对话框** ![密码输入隐藏密码时对话框](https://images.gitee.com/uploads/images/2021/0629/164405_96b990fb_1021361.png "密码隐藏.png") - **Snackbar提示框** ![Snackbar提示框](https://images.gitee.com/uploads/images/2021/0719/150802_8b4318b8_1021361.png "Snackbar提示框.png") License ------- Copyright 2021 mjsoftking 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.