O desenvolvimento de interfaces no Android frequentemente exige a implemantação de diferentes tipos de menus para melhorar a experiência do usuário e organizar ações. Este guia técnico aborda a criação de menus de opções, menus de contexto e a inclusão de submenus em uma aplicação Android utilizando Java.
Esturtura de Layout (XML)
Para demonstrar o funcionamento dos menus, utilizaremos um layout simples contendo um botão e um campo de texto. Ambos serão configurados para disparar menus de contexto após um clique longo.
<!-- activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp">
<Button
android:id="@+id/btn_trigger_context"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Pressione e segure o Botão" />
<EditText
android:id="@+id/input_trigger_context"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Pressione e segure o Campo de Texto" />
</LinearLayout>
Lógica da Activtiy e Manipulação de Menus
A classe principal lida com a inflagem dos menus e a captura de eventos de clique. Abaixo, o código demonstra como registrar componentes para menus de contexto e como estruturar o menu de opções superior.
package com.exemplo.android.menus;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private static final int MENU_ID_FIRST = 101;
private static final int MENU_ID_SECOND = 102;
private static final int MENU_ID_THIRD = 103;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button actionBtn = findViewById(R.id.btn_trigger_context);
EditText inputField = findViewById(R.id.input_trigger_context);
// Habilita o menu de contexto para as views específicas
registerForContextMenu(actionBtn);
registerForContextMenu(inputField);
}
// Gerenciamento do Menu de Opções (Barra Superior)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Criando itens de menu dinamicamente
menu.add(0, MENU_ID_FIRST, 1, "Configurações");
menu.add(0, MENU_ID_SECOND, 2, "Sobre");
MenuItem itemNavegacao = menu.add(0, MENU_ID_THIRD, 3, "Reiniciar Activity");
itemNavegacao.setIntent(new Intent(this, MainActivity.class));
// Implementação de um Submenu
SubMenu subOpcoes = menu.addSubMenu(1, 200, 4, "Arquivos");
subOpcoes.add(1, 201, 1, "Exportar PDF").setCheckable(true);
MenuItem subItemImportar = subOpcoes.add(1, 202, 2, "Importar JSON");
subItemImportar.setCheckable(true).setChecked(true);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ID_FIRST:
mostrarMensagem("Acessando Configurações");
return true;
case MENU_ID_SECOND:
mostrarMensagem("Acessando Sobre");
return true;
default:
return super.onOptionsItemSelected(item);
}
}
// Gerenciamento do Menu de Contexto (Clique Longo)
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Ações Disponíveis");
menu.add(0, 1, Menu.NONE, "Copiar Conteúdo");
menu.add(0, 2, Menu.NONE, "Excluir Registro");
SubMenu subMenuContexto = menu.addSubMenu("Mais Opções");
subMenuContexto.add("Compartilhar");
subMenuContexto.add("Favoritar");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
mostrarMensagem("Selecionado: " + item.getTitle());
return true;
}
private void mostrarMensagem(String texto) {
Toast.makeText(this, texto, Toast.LENGTH_SHORT).show();
}
// Ciclo de vida adicional dos menus
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// Chamado antes do menu ser exibido; útil para desativar itens dinamicamente
return super.onPrepareOptionsMenu(menu);
}
@Override
public void onOptionsMenuClosed(Menu menu) {
super.onOptionsMenuClosed(menu);
}
}
Diferenças entre Tipos de Menu
No Android, o Menu de Opções é global para a Activity e geralmente localizado na AppBar. Ele é ideal para ações que afetam o aplicativo como um todo. Já o Menu de Contexto é acionado por uma interação específica em um elemento da interface (geralmente um clique longo), permitindo ações focadas apenas naquele componente selecionado.
Os Submenus podem ser aninhados em ambos os tipos, sendo úteis para agrupar funções relacionadas sem poluir a interface principal do menu. Além disso, o uso de setCheckable e setGroupCheckable permite criar listas de seleção única ou múltipla dentro das opções de navegação.