首页 > 解决方案 > 自定义 AlertDialog 有时不会在 UI 上显示,为什么?

问题描述

我正在展示我自己的 AlertDialog。它在大多数情况下都可以正常工作并且显示良好,但是当我从以下活动中调用时,它不会显示在 UI 上。代码完全执行,没有异常,我什至检查了我的日志和断点,没有发现任何问题。但对话框不会出现在 UI 上。谁能告诉我可能是什么问题?

这是我的活动中调用对话框的方法。

private void showCustomDialog(final int messageType,
                                  final String titleString,
                                  final String msgString,
                                  final String specificMsgString,
                                  final int positiveButtonString,
                                  final int negativeButtonString,
                                  final Runnable positiveButtonClickHandler,
                                  final Runnable negativeButtonClickHandler) {
        if (mDialog != null && mDialog.isShowing()) {
            Log.d(TAG, "showCustomDialog: cannot display two dialogs at once.");
            return;
        }
        runOnUiThread(() -> mDialog = DialogUtil.showDialog(this, mAlertDialogBuilder, 0, messageType, titleString, msgString,
                specificMsgString, positiveButtonString, negativeButtonString, positiveButtonClickHandler, negativeButtonClickHandler));
    }

DialogUtil.showDialog 方法:

public static AlertDialog showDialog(
        Activity activity,
        AlertDialog.Builder builder,
        final int borderTopColorRes,
        final int iconRes,
        final String titleString,
        final String msgString,
        final String specificMsgString,
        final int positiveButtonString,
        final int negativeButtonString,
        final Runnable positiveButtonClickHandler,
        final Runnable negativeButtonClickHandler) {

    final DialogCustomViewBinding binding = DataBindingUtil.inflate(LayoutInflater.from(activity), R.layout.dialog_custom_view, null, false);
    binding.textSpecificMessage.setVisibility(View.GONE);
    if (borderTopColorRes != 0) {
        binding.viewBorderTop.setBackgroundColor(borderTopColorRes);
    } else {
        binding.viewBorderTop.setVisibility(View.GONE);
    }
    if (iconRes != 0) {
        binding.imageCustomDialogMessageType.setImageResource(iconRes);
    }
    if (titleString != null) {
        binding.textCustomDialogTitle.setText(titleString);
        binding.textCustomDialogTitle.setVisibility(View.VISIBLE);
    } else {
        binding.textCustomDialogTitle.setText("");
        binding.textCustomDialogTitle.setVisibility(View.GONE);
    }
    if (msgString != null) {
        binding.textDialogMessage.setText(msgString);
        binding.textDialogMessage.setVisibility(View.VISIBLE);
    } else {
        binding.textDialogMessage.setText("");
        binding.textDialogMessage.setVisibility(View.GONE);
    }

    binding.textSpecificMessage.setVisibility(View.GONE);
    if (specificMsgString != null) {
        binding.textSpecificMessage.setText(specificMsgString);
        binding.textDialogMessage.setOnClickListener(v -> {
            if (binding.textSpecificMessage.getVisibility() == View.VISIBLE) {
                binding.textSpecificMessage.setVisibility(View.GONE);
            } else {
                binding.textSpecificMessage.setVisibility(View.VISIBLE);
            }
        });
    }
    if (positiveButtonClickHandler != null) {
        binding.buttonPositive.setText(positiveButtonString);
        binding.buttonPositive.setOnClickListener(v -> positiveButtonClickHandler.run());
    } else {
        binding.buttonPositive.setVisibility(View.GONE);
    }
    if (negativeButtonClickHandler != null) {
        binding.buttonNegative.setText(negativeButtonString);
        binding.buttonNegative.setOnClickListener(v -> negativeButtonClickHandler.run());
    } else {
        binding.buttonNegative.setVisibility(View.GONE);
    }

    builder.setView(binding.getRoot());
    AlertDialog dialog = builder.create();
    try {
        dialog.show();
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        return dialog;
    } catch (Exception e) {
        Log.e(TAG, "showDialog: Exception=" + e.getMessage());
        e.printStackTrace();
    }
    return null;
}

标签: androiduser-interfacedata-bindingandroid-alertdialog

解决方案


推荐阅读