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:

Imagem para postagem

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:

  1. Um menu flutuante
  2. 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.