65

我想在我的应用程序中显示一个警报对话框。我正在使用片段。我尝试了下面的代码来做到这一点:

 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();

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

4

9 回答 9

136

替换contextgetActivity()

ApplicationContext不应用于创建对话框等任务。当您在片段中时,您可以通过调用 FragmentsgetActivity()方法来获取 Activity-Context。

于 2012-04-18T10:12:44.330 回答
16

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

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

public boolean onClick(View v) {
    ...
    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(v.getContext());
    ...
}
于 2014-05-24T12:34:35.563 回答
10

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

于 2012-04-18T10:12:25.760 回答
1

我有类似的问题,我试图从片段创建一个 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手头的问题。希望这对您也有帮助!

于 2018-02-24T12:50:42.483 回答
0

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

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

后来在另一个类(适配器类)中,我能够使用getContext()它并且它起作用了。

于 2014-04-19T08:56:17.253 回答
0

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

于 2021-08-03T09:50:14.430 回答
-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();
于 2014-09-23T07:14:07.270 回答
-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();
    }
于 2017-05-18T11:13:02.843 回答
-1

解决方案是替换为getActivity()

AlertDialog.Builder alert = new AlertDialog.Builder(getActivity(),R.style.MaDialog);
于 2020-04-27T03:17:05.663 回答