繁体   English   中英

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

[英]How to set onDismiss/CancelListener for custom dialog outside the class?

我想在取消或关闭自定义对话框时完成活动。 但是当我在其他类中使用 .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() 方法中执行您想要执行的任何功能。

问题是您使用的是 CustomDialog,它本身扩展了 Dialog 类。 但不是使用它,而是创建一个新的警报对话框并构建它。 您关闭它,但被关闭的对话框不是您的自定义对话框类,而是您在构造函数中创建的构建器对话框。 即使你解决了这个问题,它也会引入不必要的并发症。

我建议您在 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()活动时)传入null

它会工作。 如果这不是您想要的,请告诉我,我会修复它。

制作一个类似的界面

interface OnUserInformedCallback {
    fun positive()

    fun negative()
}

并在您的活动中实现这一点并将其传递给您正在获取对话框的对话框方法,您将在您的活动中获得ok和cancle的回调。 代码是这样的

 fun alertDialog(
        context: Context,
        message: String,
        positiveText: String,
        isUa: Boolean,
        callback: OnUserInformedCallback
): Dialog {
    val dialog = Dialog(context, android.R.style.Theme_Translucent_NoTitleBar)
    dialog.setContentView(R.layout.alert_dialog_layout)
    dialog.window?.setGravity(Gravity.CENTER)
    dialog.setCancelable(true)
    dialog.setCanceledOnTouchOutside(true)
    val tvOk: TextView = dialog.findViewById(R.id.visit)
    val tvMsg: TextView = dialog.findViewById(R.id.mess)
    tvMsg.text = message
    tvOk.text = positiveText
    dialog.findViewById<TextView>(R.id.cancel).setOnClickListener {
        callback.negative()
    }
    tvOk.setOnClickListener {
        callback.positive()
    }
    dialog.create()
    return dialog
}

在java中用于默认对话框

private AlertDialog getDialog(Activity context, String message, OnUserInformedCallback  callbac) {
    return new AlertDialog.Builder(context)
            .setTitle(R.string.app_name).setMessage(message)
            .setCancelable(true)
            .setPositiveButton(android.R.string.yes, (dialog12, which) -> callbac.positive())
            .setNegativeButton(android.R.string.yes, (dialog1, which) -> callbac.positive())
        .create();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM