Skip to content

基础对话框 MessageDialog 和 输入对话框 InputDialog

Kongzue edited this page Aug 9, 2022 · 29 revisions

基础对话框 MessageDialog 和 输入对话框 InputDialog

基础对话框 MessageDialog 和 输入对话框 InputDialog

基础对话框组件可以实现基本的对话框业务逻辑,包含标题、消息文本、单/双/三按钮的提醒功能,三个按钮可以按照纵向/横向进行显示,满足绝大部分日常阻断式提醒需求。

输入对话框 InputDialog 是基础对话框的扩展组件,除了包含基础的功能外还提供了输入框,可自定义输入提示文本、输入文字样式和点击按钮后的输入内容回调等。

显示一个简单消息对话框

使用以下代码显示一个对话框:

MessageDialog.show("标题", "正文内容", "确定");

请注意,标题、正文内容都可以传入 null,则不会显示相应的文本布局。

显示多个按钮的对话框:

MessageDialog.show("标题", "正文内容", "确定", "取消", "其他");

若需要将按钮显示为纵向的,可以通过以下代码设置:

MessageDialog messageDialog = new MessageDialog("标题", "正文内容", "确定", "取消", "其他")
        .setButtonOrientation(LinearLayout.VERTICAL);
messageDialog.show();

构造对话框

通过上述代码您可以看到,对话框组件可以通过 .show(...) 静态方法直接创建并显示,也可以通过new进行创建,另外要创建一个空的对话框,您可以使用 MessageDialog.build() 来实例化对话框对象。

若您在项目中引入了多个主题,需要临时改变某一个对话框的主题,亦或者是需要临时改变对话框的亮色和暗色模式,那么必须使用非“show”的方法创建,修改主题或颜色后再显示,方法如下:

MessageDialog.build()
        .setStyle(IOSStyle.style())
        .setTheme(DialogX.THEME.DARK)
        .setTitle("标题")
        .setMessage("内容")
        .setOkButton("确定")
        .show();

按钮点击回调

按钮回调可以通过方法进行设置:

MessageDialog.show("标题", "正文内容", "确定").setOkButton(new OnDialogButtonClickListener<MessageDialog>() {
    @Override
    public boolean onClick(MessageDialog baseDialog, View v) {
        toast("点击确定按钮");
        return false;
    }
});

回调中有一个返回值,若return true 则可以点击后不自动关闭对话框。

另外,DialogX 还提供了多种设置回调和按钮文本的方法:

//只设置按钮文本
.setOkButton("确定")

//只设置按钮点击回调
.setOkButton(new OnDialogButtonClickListener<MessageDialog>() {
    @Override
    public boolean onClick(MessageDialog baseDialog, View v) {
        toast("点击确定按钮");
        return false;
    }
});

//设置按钮文本并设置回调
.setOkButton("确定", new OnDialogButtonClickListener<MessageDialog>() {
    @Override
    public boolean onClick(MessageDialog baseDialog, View v) {
        toast("点击确定按钮");
        return false;
    }
});

//隐藏按钮
.setOkButton(null)

请依据个人喜好随意使用。

输入对话框按钮点击回调

InputDialog 的回调与 MessageDialog 的回调略有不同,在回调参数中个给出了输入文本内容,方便直接判断和获取输入的文本:

new InputDialog("标题", "正文内容", "确定", "取消", "正在输入的文字")
        .setCancelable(false)
        .setOkButton(new OnInputDialogButtonClickListener<InputDialog>() {
            @Override
            public boolean onClick(InputDialog baseDialog, View v, String inputStr) {
                toast("输入的内容:" + inputStr);
                return false;
            }
        })
        .show();

另外你也可以使用 inputDialog.getInputText() 来获取输入的文本内容。

生命周期回调

想要监控对话框的生命周期,可以实现其 接口,建议使用build()方法构建对话框:

MessageDialog.build()
        .setDialogLifecycleCallback(new DialogLifecycleCallback<MessageDialog>() {
            @Override
            public void onShow(MessageDialog dialog) {
                //对话框启动时回调
            }
            @Override
            public void onDismiss(MessageDialog dialog) {
                //对话框关闭时回调
            }
        })
        .show();

自定义布局

要实现在对话框中加入自定义布局,请先准备好自定义布局文件,然后使用以下方法构建:

MessageDialog.show("这里是标题", "此对话框演示的是自定义对话框内部布局的效果", "确定", "取消")
        .setCustomView(new OnBindView<MessageDialog>(R.layout.layout_custom_view) {
            @Override
            public void onBind(MessageDialog dialog, View v) {
            
            }
        });

回调参数中,v 为您给定的布局文件的实例化组件,您可以通过 v.findViewById(resId)来实例化其他子布局组件,并在 onBind 方法中设置其功能和事件回调。

自定义进入和关闭动画

针对单次显示的对话框动画修改,可使用以下方法进行自定义:

MessageDialog.build()
        .setTitle("标题")
        .setMessage("这里是正文内容。")
        .setOkButton("确定")
        .setCancelButton("取消")
        //设置入场动画资源和出场动画资源
        .setAnimResId(R.anim.anim_dialogx_bottom_enter, R.anim.anim_dialogx_bottom_exit)
        .show();

要自定义动画文件,可以参考:默认对话框启动动画文件默认对话框关闭动画文件

额外说明,除了 .setAnimResId(enterAnimResId, exitAnimResId) 外,还有 .setEnterAnimResId(enterAnimResId).setExitAnimResId(enterAnimResId) 单独方法可选,此方法仅针对单次显示的对话框有效。

另外你也可以通过 setEnterAnimDuration([long]) 设置入场动画时长以及通过 .setExitAnimDuration([long]) 设置关闭动画时长。

对 MessageDialog、InputDialog 全局生效的的动画修改:

你可以通过静态属性直接修改全局 MessageDialog、InputDialog 的动画:

//设置全局 MessageDialog 入场动画
MessageDialog.overrideEnterAnimRes = R.anim.anim_dialogx_bottom_enter;
//设置全局 MessageDialog 出场动画
MessageDialog.overrideExitAnimRes = R.anim.anim_dialogx_bottom_exit;
//设置全局 MessageDialog 入场动画时间
MessageDialog.overrideEnterDuration = 1000;
//设置全局 MessageDialog 出场动画时间
MessageDialog.overrideExitDuration = 1000;

通过自定义主题修改

您还可以通过参考自定义主题接口,完全定制全局的动画框默认动画效果,具体请查阅 《自定义 DialogX 主题》

请注意这三种设置是由优先级区别的,针对单次显示的对话框动画修改优先级 > 对 MessageDialog、InputDialog 全局生效的的动画修改 > 自定义主题修改。

其他额外方法

//强制重新刷新界面
.refreshUI();

//关闭对话框
.dismiss();

//是否允许点击外部区域或返回键关闭
.setCancelable(boolean);

//设置标题文字样式
.setTitleTextInfo(TextInfo);

//设置消息文字样式
.setMessageTextInfo(TextInfo);

//设置按钮文字样式
.setOkTextInfo(TextInfo);
.setCancelTextInfo(TextInfo);
.setOtherTextInfo(TextInfo);

//设置按钮排列方式,buttonOrientation 可选 LinearLayout.VERTICAL 或 LinearLayout.HORIZONTAL
.setButtonOrientation(buttonOrientation); 
    
//设置返回按键回调
.setOnBackPressedListener(OnBackPressedListener);

//获取对话框实例化对象,您可以通过此方法更深度的定制Dialog的功能
.getDialogImpl()

//获取自定义布局实例
.getCustomView()
    
//设置背景颜色,强行对对话框背景进行染色,请注意参数为int类型的颜色值而非R.color的索引
.setBackgroundColor(ColorInt);
    
//InputDialog 是否自动弹出键盘
.setAutoShowInputKeyboard(boolean)

//InputDialog 设置默认输入文本样式
.setInputInfo(InputInfo)

//设置对话框圆角(会裁切内容显示)
.setRadius(float px)

背景遮罩

MessageDialog 支持修改背景遮罩,这是为了丰富扩展性。如果需要背景遮罩,您可以自行使用如下代码设置:

messageDialog.setMaskColor(colorInt);

请注意,传入参数为 ColorInt 值,您可以使用 Color.parseColor("#4D000000") 设置一个 HEX 色值,或使用 getResources().getColor(R.color.black30) 设置一个颜色的资源值。

额外组件

TextInfo

TextInfo 用于存储基础文本样式设置,其包含一系列属性和响应的 get/set 方法,例如方法解释如下:

属性 解释 默认值
fontSize 字号大小,值为-1时使用默认样式,单位:dp -1
gravity 对齐方式,值为-1时使用默认样式,取值可使用Gravity.CENTER等对齐方式 -1
fontColor 文字颜色,值为1时使用默认样式,取值可以用Color.rgb(r,g,b)等方式获取 1
bold 是否粗体 false

InputInfo

InputInfo 用于提供输入内容的自定义设置,其包含一系列属性和响应的 get/set 方法,例如方法解释如下:

属性 解释 默认值
MAX_LENGTH 最大长度,-1不生效 -1
inputType 自定义输入类型,类型详见 android.text.InputType
textInfo 默认字体样式 (TextInfo)
multipleLines 是否支持多行 false
selectAllText 默认选中所有文字(便于修改) false

单独指定样式

若你的 App 引入了多种主题,在特定场景下需要使对话框显示为某种非全局的主体样式,可使用 .build() 构建对话框,然后使用 .setStyle(style) 来指定主题样式,在最后执行 .show() 命令显示对话框,例如:

MessageDialog.build()
        //或直接使用 .build(IOSStyle.style())
        .setStyle(IOSStyle.style())
        .setTitle("Title")
        .setMessage("Message content.")
        .setOkButton("OK")
        .show();
Clone this wiki locally