android - 自定义 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;
}
解决方案
推荐阅读
- python - 更新单行的不同方式之间的区别
- react-native - 给定 oauth_app 资源未找到 - Magic.Link
- azure - WebChat - 直线语音适配器错误:WebSocket 连接失败,出现 400
- c# - C#用正则表达式替换
- javascript - 有人看到问题了吗?#Bootast 脚本
- laravel - 如何显示 Laravel Breeze 状态消息
- python - 将神经网络 (Python) 编译成可执行文件
- reactjs - 自定义 useForm Hook 不更新字段值
- javascript - 有没有办法从数组中获得唯一的随机子数组,每个随机数组不应该有相同的元素?
- python - 如何拆分并转换为字典并交换键值