Android: настроить меню приложения (например, цвет фона)

Каким образом (если есть способ) настроить меню (тот, который запускается кнопкой MENU на телефоне). Меня особенно интересуют две вещи:

  • изменение цвета фона со стандартного светло-серого на темно-серый
  • как элементы меню выровнены. У меня есть 4 элемента, и они автоматически выровнены 2x2, но я бы предпочел, чтобы все они были в одной строке (1x4).

Ответ 1

Не со встроенным фреймворком меню.

Вы можете перехватить кнопку MENU (через onKeyDown() или что-то еще) и сделать то, что хотите, но имейте в виду, что пользователи будут ожидать, что это будет выглядеть, как остальные меню на своем устройстве.

Ответ 2

Я создал свой собственный класс меню. Возможно, это не совсем то, что вы хотите, но, надеюсь, вы начнете. Вот статья, которую я опубликовал, и загружаемую ссылку на исходный код.

http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx

Ответ 3

Вы также можете просто реализовать метод onCreateOptionsMenu, который обычно используется для отображения стандартного меню и отображает все, что вы хотите в этом случае.

В моей игре я внедрил его, чтобы отобразить диалоговое окно "Пауза игры" при нажатии кнопки меню...

Ответ 4

Используйте стили. Это работает для меня на Android 5.0

<style name="AppTheme" parent="android:Theme.Material.Light">
    <item name="android:colorPrimary">@color/primary</item>
    <item name="android:actionOverflowMenuStyle">@style/PopupMenu.MyStyle</item>
</style>

<style name="PopupMenu.MyStyle" parent="android:Widget.PopupMenu">
    <item name="android:popupBackground">@drawable/actionbar_item_background</item>
</style>

... тогда выталкиваемый является регулярным селектором

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/primary"/>
    <item android:drawable="@color/highlighted" android:state_pressed="true"/>
</selector>

Ответ 5

цвет фона фона в стиле .xml в вашей теме

<item name="android:panelFullBackground">@android:color/darker_gray</item>

Ответ 6

Этот ответ работает, но разбился для меня при использовании ActionBarSherlock. Здесь взломанный обход, чтобы сделать эту работу без изменений.

    // Black Vodoo! Do not try this at home.

    final LayoutInflater li = getLayoutInflater();

    final Class<LayoutInflater> clazz = LayoutInflater.class;

    try {
        final Field fieldSet = clazz.getDeclaredField("mFactorySet");
        fieldSet.setAccessible(true);
        fieldSet.setBoolean(li, false);

        li.setFactory(new Factory() {

            @Override
            public View onCreateView(final String name,
                    final Context context, final AttributeSet attrs) {
                if (name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) {
                    try {
                        final LayoutInflater f = getLayoutInflater();
                        final View view = f.createView(name, null, attrs);
                        new Handler().post(new Runnable() {
                            @Override
                            public void run() {
                                // Set the text color
                                ((TextView) view).setTextColor(Color.WHITE);
                            }
                        });
                        return view;
                    } catch (final Exception e) {
                    }
                }
                return null;
            }
        });
    } catch (final Exception e) {
        e.printStackTrace();
    }