如何在片段中显示AlertDialog?

时间:2012-04-18 10:08:19

标签: android fragment android-alertdialog android-context

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

 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:无法添加窗口 - 令牌null不适用于应用程序

从互联网上我开始知道崩溃是由于上下文问题。我给了上下文

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

我不知道这有什么问题。有谁能够帮我?

9 个答案:

答案 0 :(得分:124)

context替换为getActivity()

ApplicationContext不应用于创建对话框等任务。当您处于片段中时,您只需通过调用片段getActivity()方法即可获得活动上下文。

答案 1 :(得分:12)

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

如果您在onClick(View v)或onLongClick(View v)等事件中调用AlertDialog,您可以使用

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

答案 2 :(得分:9)

尝试使用DialogFragment,使用Fragments时,DialogFragment会更好

答案 3 :(得分:1)

我有类似的问题,我试图从Fragment创建一个AlertDialog。出现了NullPointerException。最初我做了如下:

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

NullPointerException特别是在代码中稍后调用alertDialog.show()时发生的。 但在搜索AlertDialog.Builder()的文档后,似乎有另一种方法来初始化它[AlertDialog.Builder Doc],其中包含一个主题/ resId,如下所示:

AlertDialog alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Dialog_Alert).create();

这解决了手头的NullPointerException。希望这对你有帮助!

答案 4 :(得分:0)

我在listView中的适配器中使用它,因此我无法使用getActivity()。为了使其工作,我使用getActivity()作为片段中适配器实例化的上下文:

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

后来在另一个类(适配器的类)中我能够使用getContext()并且它有效。

答案 5 :(得分:0)

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

答案 6 :(得分:-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();

答案 7 :(得分:-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();
    }

答案 8 :(得分:-1)

解决方案是将其替换为getActivity()

AlertDialog.Builder alert = new AlertDialog.Builder(getActivity(),R.style.MaDialog);