如何在Fragment中显示AlertDialog?

67

我想在我的应用程序中显示一个警告对话框。我正在使用片段。我尝试使用以下代码来执行此操作:

 AlertDialog ad = new AlertDialog.Builder(context)
            .create();
    ad.setCancelable(false);
    ad.setTitle(title);
    ad.setMessage(message);
    ad.setButton(context.getString(R.string.ok_text), new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
ad.show();

但它一直崩溃,logcat中的错误为:

  

04-18 15:23:01.770:E/AndroidRuntime(9424):android.view.WindowManager$BadTokenException:无法添加窗口-- token null不是应用程序的

从互联网上了解到,崩溃是由于上下文问题引起的。我已经将上下文给定为

context = this.getActivity().getApplicationContext();

我不知道这个有什么问题。有人能帮忙吗?

9个回答

137

context替换为getActivity()

ApplicationContext不应用于创建对话框等任务。由于您在片段中,因此可以通过调用片段的getActivity()方法来获取活动上下文。


4
如果 getActivity() 为 null,应该怎么做? - Sujith Thankachan
2
@SujithPt 当 getActivity() 返回 null 时,意味着该片段未附加到活动中,您不应显示任何对话框。 - Mousa
@SujithThankachan 你可以等待 getActivity() 不为 null。不过我还没有尝试过。 - Sreekanth Karumanaghat
2018年2月中添加了requireActivity()新方法,如果返回null,则会抛出异常。如果您确定此方法不会返回null,因为您在onAttach和onDetach之间使用它,那么可以使用它来消除getActivity()可能返回null的警告。 - Soon Santos

16

有关此问题的更多信息(AlertDialog在片段中,由事件管理):

如果您在像onClick(View v)或onLongClick(View v)这样的事件中调用AlertDialog,则可以使用

public boolean onClick(View v) {
    ...
    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(v.getContext());
    ...
}

10

尝试使用DialogFragment,当您使用Fragments时,DialogFragment更好。


请问您能否提供一份示例代码?这是我第一次听说DialogFragment。 - andro-girl
链接失效 @FUBUs - Karan Harsh Wardhan
@andro-girl https://guides.codepath.com/android/using-dialogfragment - FindOutIslamNow

1

我曾经遇到过类似的问题,当我尝试从Fragment创建AlertDialog时,出现了NullPointerException。最初我按照以下方式操作:

AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();

当代码后面调用alertDialog.show()时,出现了NullPointerException。但在查阅AlertDialog.Builder()文档后,发现还有一种初始化方法[AlertDialog.Builder Doc],可以通过包含主题/资源ID的方式进行初始化,如下所示:
AlertDialog alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Dialog_Alert).create();

这解决了手头的NullPointerException。希望这也能帮到你!

0

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

警告对话框.构造器 builder = 新的警告对话框.构造器(getActivity());


重复回答已被接受的答案。 - BabyishTank

0

我在listView内部的适配器中使用了它,因此我不能使用getActivity()。为了让它工作,我在片段中实例化适配器时使用了getActivity()作为上下文:

this.adapter = new myAdapter(getActivity(), factory);

后来在另一个类(适配器的类)中,我能够使用getContext(),并且它可以正常工作。


-1
                       AlertDialog alert= null;
                        AlertDialog.Builder build= new AlertDialog.Builder(getActivity());
                        build.setTitle("title");
                        build.setItems(stringarrayname, new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub
                            //Toast.makeText(getActivity(), "hi", Toast.LENGTH_SHORT).show();   

                            }
                        });
                        build.create().show();

我在片段中使用了这段代码,成功获取了警告对话框。 - udaysagar
这段代码是错误的,你应该使用 alert = build.create(); alert.show(); - Rodolfo Abarca

-1
解决方案是将其替换为getActivity()
AlertDialog.Builder alert = new AlertDialog.Builder(getActivity(),R.style.MaDialog);

-1

你可以尝试这个或者使用 DialogFragment

private void showAlert(final int position) {
        new AlertDialog.Builder(getActivity().getApplicationContext())
                .setTitle("Delete entry")
                .setMessage("Are you sure you want to delete this entry?")
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                      //  deleteSuggestions(position);
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // do nothing
                    }
                })
                .setIcon(android.R.drawable.ic_dialog_alert)
                .show();
    }

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