Obter um MenuItem
apontador para tal item, chamada setVisible
nele para ajustar a sua visibilidade e, em seguida, chamar invalidateOptionsMenu()
em sua atividade para que o menu ActionBar é ajustado em conformidade.
Atualização: A MenuItem
não é uma visualização regular que faz parte do seu layout. É algo especial, completamente diferente. Seus retornos de código null
para item
e que está causando o acidente. O que você precisa é fazer:
MenuItem item = menu.findItem(R.id.addAction);
Aqui está a sequência na qual você deve chamar: primeira chamada invalidateOptionsMenu()
e depois onCreateOptionsMenu(Menu)
obter uma referência ao MenuItem (chamando menu.findItem()
) e chamar setVisible()
por ele
MenuItem
pode estarnull
porque está usando emgetItem
vez defindItem
. Nós nunca poderíamos saber, sem ver o seu código e o log de falhas.onCreateOptionsMenu
e definir a visibilidade do item nesse ponto. Ou mantenha a referência por perto até decidir se ela deve ser visível ou não.invalidateOptionsMenu()
e, em seguida, dentro deonCreateOptionsMenu(Menu)
obter uma referência para oMenuItem
(chamandomenu.findItem()
) e chamásetVisible()
-lo. As respostas de suhas_sm e de P1r4nh4 apresentam a abordagem correta.Encontrou um adendo para esta pergunta:
Se você quiser alterar a visibilidade de seus itens de menu em qualquer lugar, basta definir uma variável de membro em sua atividade para lembrar que deseja ocultar o menu e chamar
invalidateOptionsMenu()
e ocultar os itens no seuonCreateOptionsMenu(...)
método substituído .No meu exemplo, eu escondi todos os itens.
fonte
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
Os documentos afirmam: "Você deve retornar true para que o menu seja exibido; se você retornar false, ele não será exibido".onPrepareOptionsMenu()
deve ser usado para mostrar / ocultar a lógica, em vez deonCreateOptionsMenu()
ser chamado apenas uma vez, para que não seja útil se você desejar alterar os itens do menu após a inicialização. Portanto, inflate no onCreate, mas mostre / oculte no onPrepare.Sim.
invalidateOptionsMenu()
quando quiser ocultar a opção. Isso vai ligaronCreateOptionsMenu()
.onCreateOptionsMenu()
, verifique a bandeira / condição e mostre ou oculte-a da seguinte maneira:fonte
invalidateOptionsMenu
vez deinvalidateOptions
?onCreateOptionsMenu
Você pode chamar isso:
Atualizar:
Verifique se o seu código não retorna
null
paraitem
ou pode travar o aplicativo.fonte
Eu estava procurando uma resposta com um pouco mais de contexto. Agora que eu descobri, vou adicionar essa resposta.
Botão Ocultar por padrão no menu xml
Por padrão, o botão de compartilhamento ficará oculto, conforme definido por
android:visible="false"
.main_menu.xml
Mostrar botão no código
Mas o botão de compartilhamento pode opcionalmente ser mostrado com base em alguma condição.
MainActivity.java
Veja também
fonte
invalidateOptionsMenu()
para atualizar o menu.não funcionou para mim. Eu tive que usar explicitamente
onPrepareOptionsMenu
para definir um item invisível.Portanto, use
onCreateOptionsMenu
para criar o menu eonPrepareOptionsMenu
alterar a visibilidade, etc.fonte
onPrepareOptionsMenu
parece o lugar certo para realizar este tipo de operação: "Prepare o menu de opções padrão da tela a ser exibido. Isso é chamado logo antes do menu ser exibido, toda vez que é exibido Você pode usar esse método para ativar / desativar itens com eficiência ou modificar dinamicamente o conteúdo ".invalidateOptionsMenu()
para atualizar o menu.Inicialmente, defina a visibilidade do item de menu como false no arquivo de layout do menu, da seguinte maneira:
Você pode simplesmente definir a visibilidade do item de menu como false no seu onCreateOptionsMenu () depois de aumentar o menu.
fonte
Tente o seguinte:
fonte
Isso funcionou para mim tanto na Atividade quanto no Fragmento
fonte
A resposta P1r4nh4 funciona bem, apenas a simplifiquei usando um sinalizador booleano:
fonte
0
e1
não é um "sinalizador booleano", é pseudo-booleano. além disso, não há razão para usar um booleano real aqui.De acordo com o site oficial do desenvolvedor Android, o OnCreateOptionMenu (menu Menu) não é recomendado para alterar itens ou ícones de menu, visibilidade .. etc no Runtime.
Como recomendado Você pode usar este método onOptionsItemSelected (Item do MenuItem) para rastrear as entradas do usuário.
Se você precisar alterar os itens de menu no tempo de execução, use o menuPrepareOptions (menu Menu) para alterá-los
fonte
setVisible(false)
para o item sempre visível, ele não desaparece até clicar nos três pontos (o próprio menu). Se eu usar nos itens reorganizar-se imediatamente, mas eles perdem suas ações (se eu clicar em qualquer item, ele não faz nada).invalidateOptionsMenu()
onPrepareOptionsMenu
defina um valor para uma variável e chame invalidateOptionsMenu ();
por exemplo
fonte
setVisible(false)
para o item sempre visível, ele não desaparece até clicar nos três pontos (o próprio menu). Se eu usar nos itens reorganizar-se imediatamente, mas eles perdem suas ações (se eu clicar em qualquer item, ele não faz nada).invalidateOptionsMenu()
onPrepareOptionsMenu
Você pode usar
toolbar.getMenu().clear();
para ocultar todos os itens de menu de uma só vezfonte
Ao definir a visibilidade de todos os itens no Menu, o menu da barra de aplicativos ou o menu excedente será Ocultar automaticamente
Exemplo
...
...
Antes de ir para outro fragmento, use o código abaixo:
fonte
https://stackoverflow.com/a/21215280/466363 - respondido por Look Alterno e Sufian
.
ActivityCompat.invalidateOptionsMenu () não retorna callPrepareOptionsMenu (); basta atualizar o menu diretamente.
Meu someMethod () é chamado de vários lugares, mesmo antes de onCreateOptionsMenu (), então devo verificar mMenu! = Null.
fonte
Se você fez tudo como nas respostas acima, mas um item de menu ainda está visível, verifique se você faz referência ao recurso exclusivo . Por exemplo, em onCreateOptionsMenu ou onPrepareOptionsMenu
Ctrl + Clique em R.id.menu_open e verifique se ele existe apenas em um arquivo de menu. Caso esse recurso já esteja sendo usado em qualquer lugar e carregado em uma atividade, ele tentará se esconder lá.
fonte
A melhor maneira de ocultar todos os itens em um menu com apenas um comando é usar "group" em seu menu xml. Basta adicionar todos os itens de menu que estarão no seu menu excedente dentro do mesmo grupo.
Neste exemplo, temos dois itens de menu que sempre serão exibidos (item regular e pesquisa) e três itens de estouro:
Em sua atividade (de preferência em onCreateOptionsMenu), use o comando setGroupVisible para definir a visibilidade de todos os itens de menu como false ou true.
Se você deseja usar este comando em qualquer outro lugar da sua atividade, salve a classe de menu em local e sempre verifique se o menu é nulo, pois você pode executar antes de createOptionsMenu:
fonte
Para aqueles que usam a biblioteca Appcompat: Se sua Atividade incluir subclasses ActionBarActivity, você poderá chamar supportInvalidateOptionsMenu ()
Visto aqui: https://stackoverflow.com/a/19649877/1562524
fonte
Eu acho que uma abordagem melhor seria usar uma variável de membro para o menu, inicializá-la em onCreateOptionsMenu () e usar setVisible () depois, sem invalidar o menu de opções.
fonte
esse código funcionou para mim
fonte
Essa abordagem funcionou para mim:
fonte
Você está tentando acessar um item de menu de uma atividade que não tem acesso ao escopo. A chamada para localizar o item de menu retornará nulo , porque a visualização não está vinculada nem à atividade nem ao layout você está chamando.
Os itens de menu são vinculados a itens como " Barra de Navegação ", que por sua vez são vinculados à atividade correspondente.
Portanto, inicialize essas visualizações em activity () e acesse os itens de menu dentro dessas visualizações.
fonte
usar
invalidateOptionsMenu()
para ligar
onPrepareOptionsMenu(menu: Menu?)
https://developer.android.com/guide/topics/ui/menus
fonte
fonte