Estou tentando mudar a cor padrão do menu de opções, que é branco: quero um fundo preto para cada item no menu de opções.
Eu tentei algumas fotos como android: itemBackground = "# 000000" no elemento item dentro do elemento de menu, mas não funcionou.
Como posso fazer isso?
android
user-interface
layout-inflater
feragusper
fonte
fonte
Respostas:
Depois de passar um tempo considerável tentando todas as opções, a única maneira de conseguir um aplicativo usando AppCompat v7 para alterar o plano de fundo do menu flutuante foi usando o atributo itemBackground:
Testado da API 4.2 a 5.0.
fonte
Esse é claramente um problema que muitos programadores enfrentam e para o qual o Google ainda não forneceu uma solução compatível e satisfatória.
Existem muitas intenções cruzadas e mal-entendidos flutuando em torno das postagens sobre este tópico, portanto, leia toda esta resposta antes de responder.
Abaixo, incluo uma versão mais "refinada" e bem comentada do hack de outras respostas nesta página, também incorporando ideias dessas questões intimamente relacionadas:
Alterar a cor de fundo do menu do Android
Como mudar a cor de fundo do menu de opções?
Android: personalizar o menu do aplicativo (por exemplo, cor de fundo)
http://www.macadamian.com/blog/post/android_-_theming_the_unthemable/
Botão de alternância de item de menu do Android
É possível tornar o fundo do menu de opções do Android não translúcido?
http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx
Configurando o fundo do menu para ser opaco
Testei esse hack no 2.1 (simulador), 2.2 (2 dispositivos reais) e 2.3 (2 dispositivos reais). Não tenho nenhum tablet 3.X para testar ainda, mas postarei as alterações necessárias aqui quando / se eu tiver. Dado que os tablets 3.X usam barras de ação em vez de menus de opções, conforme explicado aqui:
http://developer.android.com/guide/topics/ui/menus.html#options-menu
este hack quase certamente não fará nada (nenhum mal e nenhum bem) em tablets 3.X.
DECLARAÇÃO DO PROBLEMA (leia isto antes de disparar e responder com um comentário negativo):
O menu Opções tem estilos muito diferentes em dispositivos diferentes. Preto puro com texto branco em alguns, branco puro com texto preto em alguns. Eu e muitos outros desenvolvedores desejamos controlar a cor de fundo das células do menu Opções , bem como a cor do texto do menu Opções .
Certos desenvolvedores de aplicativos só precisam definir a cor de fundo da célula (não a cor do texto) e podem fazer isso de maneira mais limpa usando o estilo android: panelFullBackground descrito em outra resposta. No entanto, atualmente não há como controlar a cor do texto do menu Opções com estilos e, portanto, só se pode usar esse método para alterar o plano de fundo para outra cor que não fará o texto "desaparecer".
Adoraríamos fazer isso com uma solução documentada e preparada para o futuro, mas uma simplesmente não está disponível no Android <= 2.3. Portanto, temos que usar uma solução que funcione nas versões atuais e seja projetada para minimizar as chances de travar / quebrar em versões futuras. Queremos uma solução que retorne normalmente ao comportamento padrão caso tenha que falhar.
Existem muitas razões legítimas pelas quais alguém pode precisar controlar a aparência dos menus de opções (normalmente para corresponder a um estilo visual para o resto do aplicativo), então não vou me alongar sobre isso.
Há um bug do Google Android postado sobre isso: por favor, adicione seu apoio marcando este bug (observe que o Google desencoraja comentários "eu também": apenas uma estrela é suficiente):
http://code.google.com/p/android/issues/detail?id=4441
RESUMO DAS SOLUÇÕES ATÉ AGORA:
Vários pôsteres sugeriram um hack envolvendo LayoutInflater.Factory. O hack sugerido funcionou para Android <= 2.2 e falhou para Android 2.3 porque o hack fez uma suposição não documentada: que alguém poderia chamar LayoutInflater.getView () diretamente sem estar atualmente em uma chamada para LayoutInflater.inflate () na mesma instância LayoutInflater. O novo código no Android 2.3 quebrou essa suposição e levou a uma NullPointerException.
Meu hack ligeiramente refinado abaixo não se baseia nessa suposição.
Além disso, os hacks também contam com o uso de um nome de classe interna não documentado "com.android.internal.view.menu.IconMenuItemView" como uma string (não como um tipo Java). Não vejo como evitar isso e ainda cumprir o objetivo declarado. No entanto, é possível fazer o hack de uma maneira cuidadosa, que retornará se "com.android.internal.view.menu.IconMenuItemView" não aparecer no sistema atual.
Mais uma vez, entenda que isso é um hack e de forma alguma estou afirmando que isso funcionará em todas as plataformas. Mas nós, desenvolvedores, não vivemos em um mundo acadêmico fantasioso, onde tudo tem que estar de acordo com as regras: temos um problema a resolver e temos que resolvê-lo da melhor maneira possível. Por exemplo, parece improvável que "com.android.internal.view.menu.IconMenuItemView" exista em tablets 3.X, pois eles usam barras de ação em vez de menus de opções.
Finalmente, alguns desenvolvedores resolveram esse problema suprimindo totalmente o menu de opções do Android e escrevendo sua própria classe de menu (veja alguns dos links acima). Eu não tentei isso, mas se você tiver tempo para escrever sua própria visão e descobrir como substituir a visão do Android (tenho certeza que o diabo está nos detalhes aqui), então pode ser uma boa solução que não requer nenhum hacks não documentados.
HACK:
Aqui está o código.
Para usar este código, chame addOptionsMenuHackerInflaterFactory () UMA VEZ de sua atividade onCreate () ou sua atividade onCreateOptionsMenu (). Ele define uma fábrica padrão que afetará a criação subsequente de qualquer Menu de Opções. Não afeta os menus de opções que já foram criados (os hacks anteriores usavam um nome de função setMenuBackground (), o que é muito enganoso, pois a função não define nenhuma propriedade do menu antes de retornar).
Obrigado pela leitura e divirta-se!
fonte
O atributo de estilo para o plano de fundo do menu é
android:panelFullBackground
.Apesar do que a documentação diz, ele precisa ser um recurso (por exemplo,
@android:color/black
ou@drawable/my_drawable
), ele travará se você usar um valor de cor diretamente.Isso também eliminará as bordas do item que não consegui alterar ou remover usando a solução do primalpop.
Quanto à cor do texto, não encontrei nenhuma maneira de configurá-la por meio de estilos no 2.2 e tenho certeza de que tentei de tudo (foi assim que descobri o atributo background do menu). Você precisaria usar a solução do primalpop para isso.
fonte
Para o Android 2.3, isso pode ser feito com alguns hackers muito pesados:
A causa raiz dos problemas com o Android 2.3 é que no LayoutInflater o mConstructorArgs [0] = mContext só é definido durante a execução de chamadas para
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/view/LayoutInflater.java/#352
Eu testei para funcionar no Android 2.3 e ainda funcionar em versões anteriores. Se algo quebrar novamente em versões posteriores do Android, você simplesmente verá o estilo de menu padrão
fonte
Também tive esse problema em um aplicativo que precisava ser compatível com o Gingerbread e ainda manter o máximo possível do estilo dos dispositivos habilitados para Holo.
Eu encontrei uma solução relativamente limpa, que funcionou bem para mim.
No tema, uso um plano de fundo drawable de 9 patch para obter uma cor de plano de fundo personalizada
Desisti de tentar definir o estilo da cor do texto e apenas usei um Spannable para definir a cor do texto do meu item no código:
fonte
Foi assim que resolvi o meu. Acabei de especificar a cor de fundo e a cor do texto nos estilos. ou seja, res> valores> arquivo styles.xml.
fonte
Uma coisa a notar que vocês estão complicando demais o problema, assim como muitos outros posts! Tudo que você precisa fazer é criar seletores drawable com quaisquer fundos que você precisa e configurá-los para itens reais. Acabei de passar duas horas tentando suas soluções (todas sugeridas nesta página) e nenhuma delas funcionou. Sem mencionar que existem toneladas de erros que essencialmente reduzem seu desempenho nos blocos try / catch que você tem.
De qualquer forma, aqui está um arquivo xml de menu:
Agora em seu item1_selector:
Da próxima vez que você decidir ir ao supermercado pelo Canadá, experimente o Google Maps!
fonte
Este trabalho é bom para mim
fonte
fonte
Obrigado Marcus! Ele funciona no 2.3 sem problemas corrigindo alguns erros de sintaxe, aqui está o código corrigido
fonte
este é um arquivo XML
fonte
Se você deseja definir uma cor arbitrária, isso parece funcionar muito bem para
androidx
. Testado em KitKat e Pie. Coloque isso em seuAppCompatActivity
:Isso define a cor de
android.widget.PopupWindow$PopupBackgroundView
, que, como você deve ter adivinhado, desenha a cor de fundo. Não há overdraw e você também pode usar cores semitransparentes.fonte