PopupMenu с некорректным отображением значков - Android Studio

В старших SDK, таких как 33, PopupMenu с иконками отображается неправильно: Неверное всплывающее меню с иконками

Я не знаю, что не так.

Я создал его следующим образом:

//init the wrapper with style
Context wrapper = new ContextThemeWrapper(anchor.getContext(), R.style.MyPopupStyle);

//init the popup
PopupMenu popup = new PopupMenu(wrapper, anchor);

/*  The below code in try catch is responsible to display icons*/
if (isWithIcons) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        popup.setForceShowIcon(true);
    } else {
        try {
            Field[] fields = popup.getClass().getDeclaredFields();
            for (Field field : fields) {
                if ("mPopup".equals(field.getName())) {
                    field.setAccessible(true);
                    Object menuPopupHelper = field.get(popup);
                    assert menuPopupHelper != null;
                    Class<?> classPopupHelper = Class.forName(menuPopupHelper.getClass().getName());
                    Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class);
                    setForceIcons.invoke(menuPopupHelper, true);
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

//inflate menu
popup.getMenuInflater().inflate(menu, popup.getMenu());

popup.show();

Пробовал с SDK 23 и там отображается корректно: Правильное PopupMenu с иконками

Почему бы просто не использовать всплывающее окно? Это очень просто.

Uriel Frankel 25.11.2022 15:05
0
1
148
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следующий пост сработал для меня: https://stackoverflow.com/a/41666520/18030070

Чтобы центрировать изображение по вертикали, я использовал этот класс: https://stackoverflow.com/a/38788432/18030070

/**
 * method responsible to show popup menu
 *
 * @param anchor      is a view where the popup will be shown
 * @param isWithIcons flag to check if icons to be shown or not
 * @param menu        menu items for popup menu
 */
public static PopupMenu showPopupMenu(View anchor, boolean isWithIcons, @MenuRes int menu) {
    //init the wrapper with style
    Context wrapper = new ContextThemeWrapper(anchor.getContext(), R.style.MyPopupStyle);

    //init the popup
    PopupMenu popupMenu = new PopupMenu(wrapper, anchor);

    //inflate menu
    popupMenu.getMenuInflater().inflate(menu, popupMenu.getMenu());

    /*  The below code in try catch is responsible to display icons*/
    if (isWithIcons) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {

            insertMenuItemIcons(anchor.getContext(), popupMenu);

        } else {
            try {
                Field[] fields = popupMenu.getClass().getDeclaredFields();
                for (Field field : fields) {
                    if ("mPopup".equals(field.getName())) {
                        field.setAccessible(true);
                        Object menuPopupHelper = field.get(popupMenu);
                        assert menuPopupHelper != null;
                        Class<?> classPopupHelper = Class.forName(menuPopupHelper.getClass().getName());
                        Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class);
                        setForceIcons.invoke(menuPopupHelper, true);
                        break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    }

    return popupMenu;
}

Другие вопросы по теме

Похожие вопросы

Отключить прокрутку viewPager в Android
Создание частного конструктора и создание вторичного конструктора дает ошибку в kotlin
В чем разница между SavedStateHandle и RememberSaveable?
Автоматический перезапуск или режим выключения/включения на моем мобильном устройстве, автоматическое открытие приложения в React native
Свяжите несколько учетных записей пользователей (один и тот же адрес электронной почты) Firebase
Каково время ожидания по умолчанию для http-запросов с использованием библиотеки http dart?
В студии Android спецификаторы формата %s видны в моем тексте редактирования, и я не знаю, как их удалить
Как получитьItemCount() при использовании FirestoreRecyclerAdapter, потому что он всегда возвращает 0?
Повлияет ли выбор подписи приложения Google Play для загрузки AAB на существующих пользователей, которые уже установили APK из playstore?
Как обновить содержимое веб-просмотра (приложение для реагирования)?