PopupMenu BadTokenException для Android Marshmallow (6), но работает на Q (Android 10)? - PullRequest
1 голос
/ 31 марта 2020

Я реализовал и протестировал свое приложение с 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 и другого смартфона.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...