Uma introdução aos menus do Android
Existem três tipos de menus no Android: Popup, Contextual e Opções.
Cada um tem um caso de uso específico e um código que o acompanha. Para aprender como usá-los, continue lendo.
Cada menu deve ter um arquivo XML relacionado a ele que define seu layout. Estas são as tags associadas à opção de menu:
- Este é o elemento contêiner para o seu menu (semelhante ao LinearLayout)
- Isso denota um item e está aninhado dentro da tag de menu. Esteja ciente de que um elemento de item pode conter um
elemento para representar um submenu
- Isso é usado para indicar uma determinada propriedade ou recurso para alguns itens de menu (estado / visibilidade do IE)
Conforme mostrado no trecho de código acima, cada item de menu possui vários atributos associados a ele. Vou detalhar os principais aqui, mas se você quiser ver o que mais pode adicionar, clique aqui.
- id - Este é um identificador exclusivo para o item no menu. Você pode usar isso para ver exatamente em qual item o usuário clicou
- ícone - Se você quiser mostrar um ícone associado a esse item de menu
- title - Texto que será mostrado no menu para aquele item
- showAsAction - Este atributo só deve ser usado ao usar um menu em uma atividade que usa uma barra de aplicativo (ou como também é chamada, a barra de ação). Ele controla quando e como este item deve aparecer como uma ação na barra de aplicativos. Existem cinco valores: always, never, ifRoom, withText e collapseActionView
android:showAsAction="always|never|ifRoom|withText|collapseActionView"
Explicarei o significado de cada um desses valores na próxima seção.
Além disso, você precisa adicionar o método de menu onCreate relevante à sua atividade.
//Options Menu @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); return super.onCreateOptionsMenu(menu); } //Context Menu @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context, menu); }
Menu de Opções
Este menu geralmente está localizado na parte superior do aplicativo e nele você deve colocar ações que afetam o aplicativo como um todo. Podem ser as configurações do aplicativo ou uma caixa de pesquisa.
Usando o layout do menu acima, obtemos o seguinte menu de opções:

Conforme prometido, vamos revisar os valores que podem ser fornecidos para o atributo showAsAction:
- sempre - sempre será mostrado na barra de ação
- nunca - nunca será exibido e, portanto, estará disponível no menu flutuante
- ifRoom - somente se houver espaço suficiente na barra de ação, ele será mostrado. Lembre-se de que, de acordo com a documentação, há um limite de quantos ícones você pode ter na barra de ação.
- withText - incluirá o título do item na barra de ação
- collapseActionView - se este item tiver uma visualização de ação associada a ele, ele se tornará recolhível (da API 14 e superior)
Se prosseguirmos e alterarmos o último item em nosso menu para showAsAction = ”never” , obteremos o seguinte:

Menu Contextual
Este menu aparece quando um usuário clica longamente em um de seus elementos de IU. As opções encontradas neste menu afetam em qual elemento da IU o usuário clicou. É comum usar este tipo de menu em listas ou grades, onde a interação do usuário com cada item pode levar a uma ação específica.
Imagine um cenário onde você tem um aplicativo com uma imagem e deseja apresentar ao usuário várias opções ao clicar na imagem.
Um menu de contexto pode aparecer de duas maneiras:
- Um menu flutuante
- Uma barra de ação na parte superior do seu aplicativo
Vamos apenas demonstrar como usar a primeira opção, mas você pode ler mais sobre a segunda opção aqui.
Usando o seguinte XML:
E adicionando o seguinte código à nossa atividade principal:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TYPE_OF_LAYOUT layout = (TYPE_OF_LAYOUT)findViewById(R.id.main_layout); registerForContextMenu(layout); }
Obteremos o seguinte:

Menu popup
Um menu pop-up é um tipo de menu que exibe itens em uma lista vertical. Esta lista está anexada à visualização em que o usuário clicou para chamar este menu. É importante ter em mente que, ao escolher um menu pop-up, você não deseja que a escolha do usuário afete o conteúdo anterior que o usuário pressionou.
Usaremos o mesmo layout XML de menu de antes, mas precisaremos adicionar o seguinte código à nossa atividade:
void showPopupMenu(View view) { PopupMenu popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.actions, popup.getMenu()); popup.show(); }
Obteremos o mesmo resultado da imagem anterior, mas sem a necessidade de o usuário realizar um clique longo.
Ícones em menus pop-up
Agora eu sei por que provavelmente você está aqui: você quer saber como pode adicionar ícones aos menus .
Embora eu mostre um exemplo de como fazer isso, é aconselhável entender que esse é um recurso que não está habilitado para menus pop-up e pode causar um comportamento inesperado. Você pode fazer isso usando reflexão para ativar um sinalizador chamado setForceShowIcon .
//popup is an instance of PopupMenu try { Field[] fields = popup.getClass().getDeclaredFields(); for (Field field : fields) { if ("mPopup".equals(field.getName())) { field.setAccessible(true); Object menuPopupHelper = field.get(popup); Class classPopupHelper = Class.forName(menuPopupHelper .getClass().getName()); Method setForceIcons = classPopupHelper.getMethod( "setForceShowIcon", boolean.class); setForceIcons.invoke(menuPopupHelper, true); break; } } } catch (Throwable e) { e.printStackTrace(); }

Acabei de arranhar a superfície com os menus do Android, mas espero que seja o suficiente para inspirá-lo a se aprofundar.