kongzue / DialogX

💬 DialogX dialog box component library, easy to use, more customizable, more scalable, easy to achieve a variety of dialog boxes. DialogX对话框组件库,更加方便易用,可自定义程度更高,扩展性更强,轻松实现各种对话框、菜单和提示效果,更有Material You、iOS、MIUI等主题扩展可选
Apache License 2.0
2.11k stars 222 forks source link

两个dialog互相调用显示,会导致链接无法点击 #45

Closed libern closed 3 years ago

libern commented 3 years ago

第一个dialog里包含了SpannnableString的描述,里面的文字里有链接可以有点击效果。

//设置下划线文字
        spannableString.setSpan(UnderlineSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        //设置文字的单击事件
        spannableString.setSpan(object : ClickableSpan() {
            override fun onClick(widget: View) {
                Timber.d("ClickableSpan.onClick")
                onClickHandler()
            }
        }, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        //设置文字的前景色
        spannableString.setSpan(
            ForegroundColorSpan(application.color(R.color.accent)),
            start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        )

使用showDialog()来显示第一个dialog,此时的文字链接点击有onClick回调效果。

当第一个dialog,点击取消的时候,显示一个二次确认弹窗,

在这个第二次确认弹窗dialog的取消,setCancelButton,会直接重新调用showDialog()显示第一个dialog,此时显示的dialog正确显示下划线等外观,然而,链接却没有onClick点击效果。

状况描述: 如果在第二次弹窗的取消上直接执行showDialog(),则第一个dialog【无】点击效果。 如果在第二次弹窗的取消上添加异步0.1秒执行showDialog(),则第一个dialog【有】点击效果。 如果在第二次弹窗的onDismiss回调上直接执行showDialog(),则第一个dialog【无】点击效果。

不知道具体2个dialog显示是否有公用情况或者什么原因,希望我这个描述可以让你明白我的问题。

kongzue commented 3 years ago

经过测试未能复现您所描述的问题。测试代码如下:

private void showSecondDialog1() {
    SpannableString spannableString = new SpannableString("这里是一段文本,点击链接");
    spannableString.setSpan(new ClickableSpan(){
        @Override
        public void onClick(@NonNull View widget) {
            showSecondDialog2();
        }
    },9, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    MessageDialog.show("标题1", spannableString, "确定");
}
private void showSecondDialog2() {
    SpannableString spannableString = new SpannableString("这里是另一段一段文本,再次点击链接");
    spannableString.setSpan(new ClickableSpan(){
        @Override
        public void onClick(@NonNull View widget) {
            showSecondDialog1();
        }
    },14, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    MessageDialog.show("标题2", spannableString, "确定");
}

测试设备:Pixel5(Android 12)

另外备注:测试过程种发现需要额外在消息文本的TextView前设置.setMovementMethod(LinkMovementMethod.getInstance());

libern commented 3 years ago

你好,showSecondDialog2,就显示一个普通的dialog可以吗?就是“你确认吗?”。确认或取消两个按钮。

libern commented 3 years ago

就是2个dialog的body,一个是spannablestring,一个是普通的string

kongzue commented 3 years ago

不理解你的意思,MessageDialog默认只有一个消息内容组件,你可以使用setCustomView自定义布局实现更多功能。

libern commented 3 years ago

就是第二个dialog使用这种最简单的方式创建。message 是null的情况

MessageDialog.show("拒绝协议并退出使用?", null,"确认", “取消”)
kongzue commented 3 years ago

很抱歉,依然无法复现您所描述的问题,测试代码如下:

private void showSecondDialog1() {
    SpannableString spannableString = new SpannableString("这里是一段文本,点击链接");
    spannableString.setSpan(new ClickableSpan() {
        @Override
        public void onClick(@NonNull View widget) {
            showSecondDialog2();
        }
    }, 9, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    MessageDialog.show("标题1", spannableString, "确定");
}
private void showSecondDialog2() {
    MessageDialog.show("标题2", null, "确定")
            .setOkButton(new OnDialogButtonClickListener<MessageDialog>() {
                @Override
                public boolean onClick(MessageDialog baseDialog, View v) {
                    showSecondDialog1();
                    return false;
                }
            });
}

测试使用机器Pixel5(Android12 DP3),录屏如下: gbdyn-qc80i

libern commented 3 years ago

如图显示,需要先关闭标题1的显示,然后再显示标题2

libern commented 3 years ago

在新版中,测试没问题了。应该是旧版本的问题。