Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图在主活动之外给弹出窗口充气_Java_Android_Popupwindow - Fatal编程技术网

Java 试图在主活动之外给弹出窗口充气

Java 试图在主活动之外给弹出窗口充气,java,android,popupwindow,Java,Android,Popupwindow,我想在主修课外给一个弹出窗口充气。我可以在MainActivity内部进行充气,但是当我尝试在外部进行充气时,会出现以下错误 致命异常:主E/AndroidRuntime(7820): android.view.WindowManager$BadTokenException:无法添加窗口-- 令牌null无效;你的活动正在进行吗 以下方法适用于MainActivity: public void popUp() { LayoutInflater layoutInflater =

我想在主修课外给一个弹出窗口充气。我可以在MainActivity内部进行充气,但是当我尝试在外部进行充气时,会出现以下错误

致命异常:主E/AndroidRuntime(7820): android.view.WindowManager$BadTokenException:无法添加窗口-- 令牌null无效;你的活动正在进行吗

以下方法适用于MainActivity:

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