Estou usando a nova biblioteca appcompat v7 disponível a partir do Android 4.3 (API de nível 18).
Independentemente do que é especificado em showAsAction para um item de menu, ele não é mostrado - ele sempre cria o ícone de menu flutuante e coloca até mesmo um único item de menu sob o menu.
Tentando adicionar menu a uma atividade como esta:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_sizes, menu);
return true;
}
E aqui está meu menu xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_add_size"
android:title="@string/menu_add_item"
android:orderInCategory="10"
android:showAsAction="always"
android:icon="@android:drawable/ic_menu_add" />
</menu>
É um bug da nova biblioteca de suporte v7 ou apenas algo errado com o código? Eu usei o código semelhante com ActionBarSherlock muitas vezes antes.
"always"
não é recomendado; é melhor usar"ifRoom"
e deixar o sistema operacional decidir."Respostas:
Provavelmente está faltando o namespace obrigatório:
Substitua
[yourapp]
pelo nome do aplicativo ou qualquer namespace que você deseja em todos os lugares.Outras coisas que valem a pena verificar:
ActionBarActivity
Verifique se o problema persiste.
Documentação de referência do Android: Adicionando botões de ação . Aqui está o texto relevante:
fonte
showAsAction
atributo não existia no android-7, você deve usar o namespace do seu aplicativohttp://schemas.android.com/apk/res-auto
em todos os exemplos. Não é personalizado ou que corresponda ao seu aplicativo. Esse é o namespace real da documentação. Acho que todo mundo significa um prefixo personalizado e pode ser o que você quiser. Isso é verdade?Descobri sozinho. Com a biblioteca de suporte v7, showAsAction deve estar em um namespace personalizado como este:
fonte
Certifique-se também de usar o inflador correto no método ActionBarActivity.onCreateOptionsMenu ().
Solução correta:
Solução incorreta:
fonte
Para Fragmentos
Menus com namespace personalizado impedirão a exibição de showAsAction.
Usar o prefixo "android:" para showAsAction funcionará, embora o Android Studio observe que você deve usar um namespace personalizado.
Isso está usando Android SDK 22 e fragmentos de suporte v4, caso isso faça alguma diferença.
fonte
tools:ignore
.Tenho o mesmo problema, mas no Android 5. Eu tenho 3 itens, mas o SO ignorou meu atributo "sempre" e mostrou apenas 2 itens. Aqui está minha solução:
fonte
setShowAsActionFlags()
requer API 14, mas esta ainda era a melhor solução para mim.Além disso, certifique-se de ter o caminho correto para o namespace. Ele não apresentará uma mensagem de erro se estiver errado.
eu tinha
ao invés de
Tudo que eu sabia era que não estava funcionando. Não sei como consegui esquecer a parte / apk do caminho, mas aconteceu. Nenhuma mensagem de erro, apenas um bug indescritível para rastrear.
fonte
No meu caso, tive que remover da compilação build.gradle do meu aplicativo 'com.android.support:appcompat-v7:21.0.3'.
Aviso : Meu min sdk = 14 e o projeto criado pelo android studio inseriu minha dependência desnecessária.
Após essa substituição, você pode escrever android: showAsAction = "always"
fonte
Este pode não ser o seu caso, mas eu estava usando
new MenuInflater(this).inflate(R.menu.my_menu, menu);
mudando para
getMenuInflater().inflate(R.menu.my_menu, menu);
corrigiu o problema!
fonte
não funciona, com supportLibraryVersion = '25 .1.0 'compileSdkVersion = 25
veja o "Aviso"
Deve usar app: showAsAction com a biblioteca appcompat com xmlns: app = "http://schemas.android.com/apk/res-auto" menos ... (Ctrl + F1)
Ao usar a biblioteca appcompat, os recursos do menu devem se referir a showAsAction no namespace app:, não ao android: namespace.
Da mesma forma, quando não estiver usando a biblioteca appcompat, você deve usar o atributo android: showAsAction.
Acho que o aviso pode ser ignorado.
fonte
adicione um namespace personalizado como este para showAsAction e actionViewClass:
fonte
Eu resolvi isso substituindo
com
Isso é menuitme xml parece,
fonte
A maneira mais simples é modificar seu código adicionando
e mude este código
para
e finalmente
fonte