Я реализовал и протестировал свое приложение с AVD на Android 10 и отлично работает, но на Android 6.0 (Marshmellow) выдает исключение WindowManager $ BadTokenException. Вот код на Java:
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)
Хочу заметить, что она отлично работает на Android 10 (Q) с использованием AVD и моего собственного смартфона, но добавьте это исключение на Android 6 (Marshmellow) с помощью AVD и другого смартфона.
Заранее спасибо.