如何重用Android AlertDialog

3

我希望能够重用 alertDialog 的代码,并将其作为函数调用放在另一个 Java 文件中。但是,无法使用 "this" 来替换 "MyActivity.this"?如何将其作为参数传递?最好让代码具有通用性。

    AlertDialog alertDialog = new AlertDialog.Builder(MyActivity.this).create();
            alertDialog.setTitle("Alert");
            alertDialog.setMessage("Alert message to be shown");
            alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
            alertDialog.show();

这是一个上下文,您可以发送上下文以重用它:new AlertDialog.Builder(context).create()。 - Norutan
为什么我不能使用getApplicationContext(),因为这将比使用MyActivity.this更通用,而后者将需要在每个Java/项目文件中更改。 - DriveCarefully
3个回答

3
您可以在一个单独的类中使用类似于这样的内容,例如我使用了AlertUtils.java
public class AlertUtils
{
    public static void showOKDialog(Context context, String title, String message)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(title);
        builder.setMessage(message);
        builder.setPositiveButton(android.R.string.ok, null);
        builder.show();
    }
}

在这种方法中,您传递的Context可以是您的Activity的this,例如:MyActivity.this或片段的getContext()AlertUtils.showOKDialog(MyActivity.this, "对话框标题", "在对话框中显示的消息");

为什么我不能使用getApplicationContext(),因为这将比使用MyActivity.this更通用,而后者将不得不在每个Java/项目文件中更改。 - DriveCarefully
这是一个更可接受的解决方案,只是我必须彻底重构活动名称。代码足够通用。 - DriveCarefully
这里有一个对不同类型的上下文及其提供的功能的很好的解释:Context Compatibilities。请向下滚动到页面中间的“Context Compatibilities”部分。基本上,applicationContext没有显示对话框的能力。唯一可以显示对话框的是Activity上下文。 - behelit

0
public class Utils {
    public void showDialog(Context context) {
        AlertDialog alertDialog = new AlertDialog.Builder(context).create();
        alertDialog.setTitle("Alert");
        alertDialog.setMessage("Alert message to be shown");
        alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
        alertDialog.show();
    }
}

在你的Activity中,你可以通过以下方式重用显示对话框:

new Utils().showDialog(MyActivity.this);


初始化一个类只为了一个工具并不是一个好主意。只需将您的showDialog设置为“静态”。 - Enzokie
@Enzokie,你能解释一下为什么吗?或者你能给我一些有用的链接吗? - Linh
因此,您应避免创建不需要的对象实例(https://developer.android.com/training/articles/perf-tips.html)。其次,如果您可以将showDialog设置为静态方法,则可以直接使用`Utils.showDialog(....)`,这样更加简洁。 - Enzokie

0

你可以将你的警告对话框代码单独写在一个类中,如下所示:

public class Utils{
  public static void showMessage(final Activity activity, String title, String posText){

    MaterialDialog dialog = new MaterialDialog.Builder(activity)
            .content(title)
            .positiveText(posText)
            .onPositive(new MaterialDialog.SingleButtonCallback() {
                @Override
                public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {

                    dialog.dismiss();
                }
            })
            .build();
    dialog.show();

}
}

从您的活动/片段中,您可以这样调用:

活动,

AppUtils.showMessage(this, getString("your text"), getString("your text"));

片段,

AppUtils.showMessage(getActivity(),getString("your text"), getString("your text"));

在片段或活动中导入Utils类,然后一切都会完美运作。

希望这能帮助你摆脱问题。


你能测试运行代码吗?从活动传递“this”会出现错误。 - DriveCarefully
@DriveCarefully 我在我的应用程序中使用相同的代码,它运行良好。如果它给你带来问题,你可以尝试使用“youractivity.this”代替“this”。 - Riten
由于代码包含其他项,如MaterialDialog,因此我无法对其进行一些测试。但是似乎我们可以传递Activity activity而不是Context context。有什么区别吗? - DriveCarefully

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接