Android: настроить меню приложения (например, цвет фона)
Какой способ (если есть способ) настроить меню (которое вызывается кнопкой МЕНЮ телефона). Меня особенно интересуют две вещи:
- изменение цвета фона со стандартного светло-серого на темно-серый
- как пункты меню выровнены. У меня есть 4 предмета, и они автоматически выровнены 2х2, но я бы предпочел, чтобы все они были в одной строке (1х4)
6 ответов
Не со встроенным каркасом меню.
Вы можете перехватить кнопку MENU (через onKeyDown()
или что-то в этом роде) и отображать, что вы хотите, но имейте в виду, что пользователи будут ожидать, что он будет выглядеть так же, как остальные меню на их устройстве.
Я создал свой собственный класс меню. Возможно, это не совсем то, что вы хотите, но, надеюсь, вам стоит начать. Вот статья, которую я опубликовал, и ссылка для скачивания на исходный код.
http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx
Вы также можете просто реализовать метод "onCreateOptionsMenu", который обычно используется для отображения стандартного меню и отображения того, что вы хотите в этом случае.
В моей игре я реализовал это для отображения диалогового окна "Игра приостановлена" при нажатии кнопки меню...
Используйте стили. Это работает для меня на 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>
Цвет фона меню в style.xml в вашей теме
<item name="android:panelFullBackground">@android:color/darker_gray</item>
Этот ответ работает, но у меня произошел сбой при использовании 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();
}