Android: personalize o menu do aplicativo (por exemplo, cor de fundo)
-
22-09-2019 - |
Pergunta
Qual é a maneira (se houver uma maneira) de personalizar o menu (o acionado pelo botão de menu do telefone). Estou especialmente interessado em duas coisas:
- Alterando a cor do fundo do cinza claro padrão para um cinza mais escuro
- Como os itens do menu estão alinhados. Eu tenho 4 itens e eles estão alinhados automaticamente 2x2, mas eu preferiria ter todos em uma linha (1x4)
Solução
Não com a estrutura de menu integrada.
Você pode interceptar o botão de menu (via onKeyDown()
ou algo assim) e renderize o que você deseja, mas lembre -se de que os usuários esperam que pareça o restante dos menus no dispositivo.
Outras dicas
Eu criei minha própria aula de menu. Talvez não seja exatamente o que você quer, mas espero que você comece. Aqui está o artigo que publiquei e um link para download para o código -fonte.
http://www.codeproject.com/kb/android/androidmenusmyway.aspx
Você também pode implementar o método "OnCreateOptionsMenu", que geralmente é usado para exibir o menu padrão e exibir o que quiser neste caso.
No meu jogo, eu o implementei para exibir uma caixa de diálogo "Jogo pausada" quando o botão de menu é pressionado ...
Use estilos. Isso funciona para mim no 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>
... então o desenhado é um seletor regular
<?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>
Menu de fundo cor em estilo.xml em seu tema
<item name="android:panelFullBackground">@android:color/darker_gray</item>
Esta resposta Funcionou, mas caiu para mim ao usar o ActionBarsherlock. Aqui está uma solução alternativa para tornar esse trabalho no entanto.
// 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();
}