Implementação de Menus no Android: Opções, Contexto e Submenus

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.

Tags: android java AndroidUI MobileDevelopment UserInterface

Publicado em 7-24 20:28