java - 如何为类外的自定义对话框设置onDismiss/CancelListener?

标签 java android dialog customdialog

我想在取消或关闭自定义对话框时完成 Activity 。但是当我在其他类中使用 .setOnDismissListener 时,它永远不会在内部达到。我发现了几个问题,但解决方案是在 customDialog 类中覆盖 onDismiss 方法。但是我不需要为我创建的每个 customDialog 覆盖 onDismiss 方法。我该怎么办?

这是我在另一个类中调用的代码,但从未在日志“setOnDismissListener”中收到消息。

customDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialog) {                                                       
        Log.d(TAG, "setOnDismissListener");
    }
});

我的 CustomDialog 类:

public class CustomDialog extends Dialog {
    private static final String TAG = "CustomDialog";

    public CustomDialog(Context context, String title, String message) {
        super(context);

        TextView textView = new TextView(context);

        textView.setGravity(Gravity.CENTER);
        textView.setPadding(10, 50, 10, 10);
        textView.setText(title);
        textView.setTextColor(Color.BLACK);
        textView.setTextSize(20);

        Typeface boldTypeface = Typeface.defaultFromStyle(Typeface.BOLD);
        textView.setTypeface(boldTypeface);

        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder
                .setCustomTitle(textView)
                .setMessage(message)
                .setPositiveButton("Ok",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        });

        AlertDialog customDialog = builder.show();

        TextView messageText = customDialog.findViewById(android.R.id.message);
        if (messageText != null) {
            messageText.setGravity(Gravity.CENTER);
            messageText.setTextColor(Color.GRAY);
        } else {
            Log.w(TAG, "messageText is null");
        }
    }
}

最佳答案

是的,所以如果您不使用某些 API 来解析信息,或者使用局部变量,我建议您在 onClickListener() 方法中执行任何您想执行的功能。

The problem is that you are using your CustomDialog which itself extends the Dialog Class. But instead of using that you create a new alert dialog and build that. You dismiss it, but the dialog which is dismissed is not your custom dialog class, but the builder dialog you created in your constructor. Even if you fixed for that, it introduces unnecessary complications.

我建议您在 onClickListener() 函数中创建 Intent。这样做的方法是更改​​您的构造函数以支持回调监听器。简而言之,当您收听的对话是另一个对话时,您不能只添加一个 onDismissListener() 。您可以做的是在用户将对话框作为特殊情况关闭时传入您想要执行的功能。见下文。

  1. 因此,首先,像这样修改您的构造函数:

    public CustomDialog(Context context, String title, String message, 
    DialogInterface.OnClickListener listener) {
         super(context);
    }
    
  2. 在您的构造函数中粘贴您之前的代码:

    TextView textView = new TextView(context);
    textView.setGravity(Gravity.CENTER);
    textView.setPadding(10, 50, 10, 10);
    textView.setText(title);
    textView.setTextColor(Color.BLACK);
    textView.setTextSize(20);
    
    Typeface boldTypeface = Typeface.defaultFromStyle(Typeface.BOLD);
    textView.setTypeface(boldTypeface);
    
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder
            .setCustomTitle(textView)
            .setMessage(message)
            .setPositiveButton("Ok", listener);
    
    AlertDialog customDialog = builder.show();
    
    TextView messageText = customDialog.findViewById(android.R.id.message);
    if (messageText != null) {
        messageText.setGravity(Gravity.CENTER);
        messageText.setTextColor(Color.GRAY);
    } else {
        Log.w(TAG, "messageText is null");
    }
    

    你所做的就是在你过去创建一个新的 onClickListener() 的地方传入监听器参数。

  3. 转到您的 MainActivity 或您创建自定义对话框的位置。这样做:

    CustomDialog customDialog = new CustomDialog(FirstActivity.this, "Title", "Message", 
    new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
               //Do your functionality here.
               Intent intent = new Intent(context, activity.class);
               //Add any flags if you want
               ...
               context.startActivity(intent);
    
               //Or you can simply do context.finish();
        }
    });
    

    当你不想传递 onClickListener() 时(意思是当你不想 finish() Activity 时)传入 null .

它会起作用的。如果这不是您想要的,请告诉我,我会解决它。

关于java - 如何为类外的自定义对话框设置onDismiss/CancelListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57229612/

相关文章:

Java - 从 SQL 数据库读取时遇到问题

java - 这段同步代码是如何破解的?

java - 如何通过 Socket Java 传输数据

Android DatePicker 对话框未在 Android 6 上显示

java - 使用spring 4从系统环境变量获取数据

android - 显示随机字符串

java - 无法实现自定义ArrayList的RecycleAdapter获取数据库随机查询结果

android - 显示加载对话框,直到网页在 WebView 中完全加载

javascript - jqGrid 使用 celledit 显示自己的错误对话框

java - 从 web.xml 文件(CDATA 项)中删除 "error"标记