Java 试图在主活动之外给弹出窗口充气
我想在主修课外给一个弹出窗口充气。我可以在MainActivity内部进行充气,但是当我尝试在外部进行充气时,会出现以下错误 致命异常:主E/AndroidRuntime(7820): android.view.WindowManager$BadTokenException:无法添加窗口-- 令牌null无效;你的活动正在进行吗 以下方法适用于MainActivity:Java 试图在主活动之外给弹出窗口充气,java,android,popupwindow,Java,Android,Popupwindow,我想在主修课外给一个弹出窗口充气。我可以在MainActivity内部进行充气,但是当我尝试在外部进行充气时,会出现以下错误 致命异常:主E/AndroidRuntime(7820): android.view.WindowManager$BadTokenException:无法添加窗口-- 令牌null无效;你的活动正在进行吗 以下方法适用于MainActivity: public void popUp() { LayoutInflater layoutInflater =
public void popUp() {
LayoutInflater layoutInflater
= (LayoutInflater)this
.getSystemService(MyGameActivity.LAYOUT_INFLATER_SERVICE);
View popupView = layoutInflater.inflate(R.layout.gameover, null);
PopupWindow popupWindow = new PopupWindow(
popupView,
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
popupWindow.showAtLocation(popupView, 0, 87, 120);
}
下面的方法是我试图在MainActivity类之外使用的方法(此方法给出了错误):
你知道我怎样才能在我的主要活动之外工作吗
---编辑
LogCat结果:
03-30 19:53:18.596: W/dalvikvm(8437): threadid=1: thread exiting with uncaught exception (group=0x4001d560)
03-30 19:53:18.596: E/AndroidRuntime(8437): FATAL EXCEPTION: main
03-30 19:53:18.596: E/AndroidRuntime(8437): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
03-30 19:53:18.596: E/AndroidRuntime(8437): at android.view.ViewRoot.setView(ViewRoot.java:533)
03-30 19:53:18.596: E/AndroidRuntime(8437): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
03-30 19:53:18.596: E/AndroidRuntime(8437): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
03-30 19:53:18.596: E/AndroidRuntime(8437): at android.widget.PopupWindow.invokePopup(PopupWindow.java:907)
03-30 19:53:18.596: E/AndroidRuntime(8437): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:767)
03-30 19:53:18.596: E/AndroidRuntime(8437): at nl.saxion.act.playground.GameView.popUp(GameView.java:314)
03-30 19:53:18.596: E/AndroidRuntime(8437): at nl.saxion.act.playground.GameView.movePlayerLeft(GameView.java:299)
03-30 19:53:18.596: E/AndroidRuntime(8437): at nl.saxion.act.playground.MyGameActivity$1.onClick(MyGameActivity.java:93)
03-30 19:53:18.596: E/AndroidRuntime(8437): at android.view.View.performClick(View.java:2538)
03-30 19:53:18.596: E/AndroidRuntime(8437): at android.view.View$PerformClick.run(View.java:9152)
03-30 19:53:18.596: E/AndroidRuntime(8437): at android.os.Handler.handleCallback(Handler.java:587)
03-30 19:53:18.596: E/AndroidRuntime(8437): at android.os.Handler.dispatchMessage(Handler.java:92)
03-30 19:53:18.596: E/AndroidRuntime(8437): at android.os.Looper.loop(Looper.java:130)
03-30 19:53:18.596: E/AndroidRuntime(8437): at android.app.ActivityThread.main(ActivityThread.java:3687)
03-30 19:53:18.596: E/AndroidRuntime(8437): at java.lang.reflect.Method.invokeNative(Native Method)
03-30 19:53:18.596: E/AndroidRuntime(8437): at java.lang.reflect.Method.invoke(Method.java:507)
03-30 19:53:18.596: E/AndroidRuntime(8437): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
03-30 19:53:18.596: E/AndroidRuntime(8437): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
03-30 19:53:18.596: E/AndroidRuntime(8437): at dalvik.system.NativeStart.main(Native Method)
在这里:
context = MyGameActivity.getContext(); //<<
并通过将上下文传递为以下内容,从MainActivity调用popUp
方法:
popUpClass popObj=new popUpClass();
popObj.popUp(MainActivity.this);
在你的第二种方法中
MyGameActivity.getContext();
指保存MyGameActivity
类实例的静态方法。这是一个非常糟糕的主意
事实上,您应该理解,而且一开始需要时间,Android活动或片段,一般情况下,都有一个生命周期。这意味着一旦停止使用,就不应再使用它们。这将有两个副作用:
- 当您持有对该实例的引用时,可以防止该实例被垃圾收集,从而污染内存
- 此上下文无法使用,使用它可以而且将创建与内存泄漏、对话框泄漏等相关的错误
LayoutInflated.from( this );
我已经尝试了上述方法,但仍然得到了同样的致命异常。LogCat还指向以下代码行:popupWindow.showAtLocation(popupView,0,87,120);这有可能导致问题吗?@Johan:如果仍然存在问题,请添加带有问题的logcat结果,以及使用您的建议后添加的最新代码logcat。@Johan:从Activity调用popUp()时,您在popUp()中传递了什么参数?mGameView.popUp(MyGameActivity.this);
MyGameActivity.getContext();
LayoutInflater layoutInflater
= (LayoutInflater)this
.getSystemService(MyGameActivity.LAYOUT_INFLATER_SERVICE);
LayoutInflated.from( this );