【问题标题】:Android dialogs are causing android.view.WindowManager$BadTokenException: Unable to add windowAndroid 对话框导致 android.view.WindowManager$BadTokenException: Unable to add window
【发布时间】:2013-04-11 10:46:24
【问题描述】:

我已将我的活动放在子视图中,现在我无法显示来自我的活动和适配器的对话框。在我的 logCat 中,我得到了

04-11 12:39:59.823: E/AndroidRuntime(12831): FATAL EXCEPTION: main
04-11 12:39:59.823: E/AndroidRuntime(12831): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@41971f18 is not valid; is your activity running?
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:513)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.view.Window$LocalWindowManager.addView(Window.java:537)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.app.Dialog.show(Dialog.java:278)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.app.AlertDialog$Builder.show(AlertDialog.java:932)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at com.myapp.functions.DownloadsDetailsAdapter$1$2.run(DownloadsDetailsAdapter.java:148)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.app.Activity.runOnUiThread(Activity.java:4170)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at com.myapp.functions.DownloadsDetailsAdapter$1.onClick(DownloadsDetailsAdapter.java:139)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.view.View.performClick(View.java:3511)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.view.View$PerformClick.run(View.java:14105)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.os.Handler.handleCallback(Handler.java:605)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.os.Looper.loop(Looper.java:137)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at android.app.ActivityThread.main(ActivityThread.java:4440)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at java.lang.reflect.Method.invokeNative(Native Method)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at java.lang.reflect.Method.invoke(Method.java:511)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
04-11 12:39:59.823: E/AndroidRuntime(12831):    at dalvik.system.NativeStart.main(Native Method)

这是我尝试显示对话框的示例。

AlertDialog.Builder builder = new AlertDialog.Builder(
                            activity);
                    builder.setMessage(R.string.are_you_sure)
                            .setPositiveButton(R.string.yes,
                                    dialogClickListener)
                            .setNegativeButton(R.string.no, dialogClickListener)
                            .show();

注意:此代码在我进行更改之前有效。我觉得我应该在新的 runnable 中运行它,但如果我必须这样做,谁能告诉我该怎么做?

【问题讨论】:

  • activity 的实例不再有效... fx.:您从 ActivityX 实例调用某些函数,而 var activity 设置为 ActivityA 的实例(或已关闭的实例ActivityX)
  • @Selvin 你能给我一个示例解决方案吗..
  • 这很难解释...但是您可以尝试在方法调用中传递 Activity,而不是使用存储在 'activity' var ... fx 中的实例。 : 如果你有void static DoSomething(String param1) 之类的方法,请改用void static DoSomething(Activity activity, String param1)

标签: android multithreading android-dialog


【解决方案1】:

我也遇到了同样的问题。我为此使用了标签栏。只需使用getParent() 而不是youractivity.this

我希望这会有所帮助。

【讨论】:

  • 非常感谢您分享信息。这是使用我的应用程序。
  • @Narasimha 很高兴为您提供帮助。
【解决方案2】:

activity 对象必须是当前显示在屏幕上的活动。 如果它是已经暂停或尚未构建显示的内容,则会出现此错误。

【讨论】:

    【解决方案3】:

    在此处查看 ActivityGroup 的答案。

    对于 ActivityGroup 的子 Activity,当我们在 PrompDialog 等子 Activity 中使用 Context 时,我们无法确定它是否始终存在并存在。 例如:

    mPromptDialog = new LoginPromptDialog(this);//this is used as Context
    //But when we use this context it may be destroyed.
    //So this is the parent instance
    mPromptDialog = new LoginPromptDialog(this.getParent());
    

    偏好: http://www.cnblogs.com/kaima/archive/2011/08/04/2127813.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2017-11-28
      • 1970-01-01
      • 2016-10-31
      相关资源
      最近更新 更多