Java Android棉花糖(6)上的弹出菜单异常,但在Q(Android 10)上有效吗?
我在安卓10上用AVD实现并测试了我的应用程序,效果很好,但在安卓6.0(Marshmellow)上出现了WindowManager$BadTokenException。以下是Java上的代码:Java Android棉花糖(6)上的弹出菜单异常,但在Q(Android 10)上有效吗?,java,android,android-studio,Java,Android,Android Studio,我在安卓10上用AVD实现并测试了我的应用程序,效果很好,但在安卓6.0(Marshmellow)上出现了WindowManager$BadTokenException。以下是Java上的代码: public class MainActivity extends AppCompatActivity{ private PopupMenu aMenu; public void OnCreate(){ ... ImageButton button =
public class MainActivity extends AppCompatActivity{
private PopupMenu aMenu;
public void OnCreate(){
...
ImageButton button = findViewById(R.id.id_1);
aMenu = new PopupMenu(MainActivity.this, button);
aMenu.getMenuInflater().inflate(R.menu.menu_1,
aMenu.getMenu());
...
}
/**
* This is assigned onClick in a button on activity_main.xml
*/
public void method(final View view) {
aMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
int selected = item.getItemId();
if (selected == ...){
...
} else if (selected == R.id.id_2) {
impotantMethod(view);
} else {...}
}
}
/**
* Important method that throws the Exception
*/
private void importantMethod(final View view){
final View popup = View.inflate(MainActivity.this, R.layout.popup, null);
final PopupWindow popupWindow = new PopupWindow(
popup, LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT, true
);
popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
Button ok_button = popup.findViewById(R.id.ok_button);
final Button importantButton = popup.findViewById(R.id.important_button);
...
importantButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Context wrapper = new ContextThemeWrapper(MainActivity.this,
R.style.PopupMenuTheme);
PopupMenu popupFailed = new PopupMenu(wrapper, importantButton);
popupFailed.getMenuInflater().inflate(R.menu.menu_to_show,
popupFailed.getMenu());
popupFailed.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
...
return true;
}
}); popupFailed.show();
}
});
ok_button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {...}
});
}
}
我试图只显示必要的代码,但如果需要更多的代码来了解失败的地方,我可以编辑它。以下是异常的完整堆栈跟踪:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.group.mainpackage, PID: 6422
android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@f1adfa6 is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:567)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
at android.widget.PopupWindow.invokePopup(PopupWindow.java:1258)
at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1110)
at android.widget.ListPopupWindow.show(ListPopupWindow.java:658)
at com.android.internal.view.menu.MenuPopupHelper.tryShow(MenuPopupHelper.java:170)
at com.android.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:124)
at android.widget.PopupMenu.show(PopupMenu.java:218)
at com.group.mainpackage.MainActivity$13.onClick(MainActivity.java:<--->)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
E/AndroidRuntime:致命异常:主
进程:com.group.mainpackage,PID:6422
android.view.WindowManager$BadTokenException:无法添加窗口--标记android.view.ViewRootImpl$W@f1adfa6无效;你的活动正在进行吗?
在android.view.ViewRootImpl.setView(ViewRootImpl.java:567)
位于android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)
在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
在android.widget.popuwWindow.invokePopup(popuwWindow.java:1258)中
在android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1110)中
在android.widget.ListPopupWindow.show(ListPopupWindow.java:658)上
在com.android.internal.view.menu.MenuPopupHelper.tryShow上(MenuPopupHelper.java:170)
在com.android.internal.view.menu.MenuPopupHelper.show上(MenuPopupHelper.java:124)
在android.widget.PopupMenu.show(PopupMenu.java:218)中
在com.group.mainpackage.MainActivity$13.onClick(MainActivity.java:)
在android.view.view.performClick上(view.java:5198)
在android.view.view$PerformClick.run(view.java:21147)
位于android.os.Handler.handleCallback(Handler.java:739)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5417)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:726)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我想说的是,它在使用AVD和我自己的智能手机的安卓10(Q)上运行良好,但在使用AVD和另一款智能手机的安卓6(Marshmellow)上却出现了这个例外
提前谢谢