AlertDialog.show()使我的应用程序崩溃。

11

这是我的问题:

我正在尝试显示一个 AlertDialog,但似乎无法实现。

这是我的代码:

tv.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View arg0)
        {
            final EditText input = new EditText(c);

            AlertDialog.Builder adb = new AlertDialog.Builder(c);
            adb.setTitle(lb)
            .setMessage("Test")
            .setView(input)
            .setPositiveButton("Ok", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    //tv.setText(input.getEditableText().toString());
                    Toast.makeText(c, input.getEditableText().toString(), Toast.LENGTH_LONG).show(); 
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener()
            {
                  public void onClick(DialogInterface dialog, int whichButton)
                  {
                      dialog.cancel();
                  }
            }).show();
        }
    });

当用户点击标签时,我想展示这个AlertDialog,然后在用户按下“确定”按钮时,使用编辑文本的值来更改标签值。

但是,在尝试点击时展示对话框时,它会崩溃。

07-18 16:04:59.240: E/AndroidRuntime(10503): FATAL EXCEPTION: main
07-18 16:04:59.240: E/AndroidRuntime(10503):    android.view.WindowManager$BadTokenException: Unable to add window -- 
token null is not for an application
07-18 16:04:59.240: E/AndroidRuntime(10503):    at     android.view.ViewRootImpl.setView(ViewRootImpl.java:710)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at   android.view.WindowManagerImpl.addView(WindowManagerImpl.java:345)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at   android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at android.app.Dialog.show(Dialog.java:277)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at android.app.AlertDialog$Builder.show(AlertDialog.java:932)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at com.technicachat.webdatadomo.Consignes$2$1.run(Consignes.java:114)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at android.app.Activity.runOnUiThread(Activity.java:4784)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at com.technicachat.webdatadomo.Consignes$2.onClick(Consignes.java:90)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at android.view.View.performClick(View.java:4211)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at android.view.View$PerformClick.run(View.java:17267)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at android.os.Handler.handleCallback(Handler.java:615)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at android.os.Looper.loop(Looper.java:137)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at android.app.ActivityThread.main(ActivityThread.java:4898)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at java.lang.reflect.Method.invokeNative(Native Method)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at java.lang.reflect.Method.invoke(Method.java:511)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
07-18 16:04:59.240: E/AndroidRuntime(10503):    at dalvik.system.NativeStart.main(Native Method)

我收到这条消息之前的行数较少:

07-18 16:04:56.645: I/Choreographer(10503): Skipped 32 frames!  The application may be doing too much work on its main thread.

我知道这是什么意思,但我只是在展示一个对话框而已,这并不需要太多工作!

我希望你们能帮助我!

再见


c变量是什么? - Ken Wolf
翻译:不好意思,只是上下文:c = getApplicationContext(); - Arthur Rey
当然是,不是空指针。 - Arthur Rey
我猜,顺便说一下,如果c为null,我不会得到NPE,在第六行会崩溃,是.show()让我崩溃。 - Arthur Rey
请查看此帖子及其中的表格:http://www.doubleencore.com/2013/06/context/ 它解释了所有不同上下文中可用的内容。 - Ken Wolf
显示剩余3条评论
7个回答

34

您的变量c应该是YourActivity.this而不是getApplicationContext()


1
谢谢,它像魔法一样有效。顺便问一下,getApplicationContext()与YourActivity.this有什么不同? - Akay

7

您需要考虑以下几点。

  1. 您正在自定义警报对话框,例如定位按钮并设置布局参数(如边距)。

    如果是这样,请使用V7支持的Alert Dialog来解决问题。确保在项目中导入了v7 support库。

    android.app.AlertDialog.Builder更改为android.support.v7.app.AlertDialog.Builder

  2. 您正在Activity或Activity的子类或Fragment内创建警报对话框。

    始终传递Activity上下文而不是baseContextapplicationContext

    传递错误的上下文(例如applicationContext或baseContext)将导致WindowManager-BadToken异常。

在Activity中...

AlertDialog.Builder dialog = new AlertDialog.Builder(this);

在活动的子类中...
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);

在一个Fragment中...
AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity()); // Activity inherits from Context and hence will work.

我发现对 v7 Support AlertDialog 进行大量自定义可以很好地实现 Alert Dialog 的效果。 在我的情况下,如果有一个以上的按钮,我必须将 Alert Dialog 的按钮居中并设置左右边距。 更改导入为 v7 support 解决了这个问题。 希望这可以帮助您。

1
将我的活动的 this 传递给 AlertDialog.builder 而不是 baseContext 解决了我的问题。 - Carl Smith

4

我曾经遇到了这个问题,持续了1、2天,但是通过修改代码解决了。

将:

final Dialog dialogView = new Dialog(getApplicationContext());

改为:

final Dialog dialogView = new Dialog(Leave_Notification_Activity.this);

你不应该使用getApplicationContext(),而应该使用YourActivity.this来解决这个问题。


1
如果您使用的是Kotlin,则需使用this@YourActivity代替applicationContext

0

如果没有创建AlertDialog类对象,您将无法显示任何内容。

AlertDialog ad=adb.create();
ad.show();

现在它会工作,请检查一次。

0
在我的情况下,只需在构建器中添加一个主题: AlertDialog.Builder(this, R.style.MyDialogTheme)

-2

试试这个吐司。

Toast.makeText(getApplicationContext(), input.getEditableText().toString(), Toast.LENGTH_LONG).show(); 

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