domingo, 26 de fevereiro de 2012

Android - Criando menu

Olá

Hoje vamos aprender como criar um Menu manualmente, como todos devem saber é de grande importância em qualquer aplicativo se ter um menu com as opções que forem necessárias ao aplicativo.

Para isso devemos implementar dois métodos que já são nativos a qualquer Activity.

Abaixo segue o fonte necessário para criar um menu.

Arquivo main.xml, layout da única tela apresentada nesse projeto:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Escola de Android - criando menu"/>
</LinearLayout>


Arquivo main.java:
package br.com.EscolaDeAndroid.Menu;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;

public class main extends Activity {
    //definição das constantes utilizadas na criação do menu
    private static final int ARQUIVO = 0;
    private static final int EDITAR = 1;
    private static final int FORMATAR = 2;

    private static final int ARQ_NOVO = 3;
    private static final int ARQ_SALVAR = 4;

    private static final int EDITAR_RECORTAR = 5;
    private static final int EDITAR_COPIAR = 6;
    
    private static final int FORMATAR_FONTE = 7;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    //o método abaixo é disparado quando o usuário
    //clicar no botão "Menu" do aparelho
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        try
        {
            //cria o menu e submenus
            SubMenu menuArquivo = menu.addSubMenu(ARQUIVO, 0, 0, "Arquivo");
            SubMenu menuEditar = menu.addSubMenu(EDITAR, 1, 0, "Editar");
            MenuItem menuFormatar = menu.add(FORMATAR, FORMATAR_FONTE, 0, "Formatar");        
            
            //define uma tecla de atalho para o menu, nesse caso a 
            //tecla de atalho é a letra "F"
            menuFormatar.setShortcut('0', 'F');
            
            //adiciona um ícone ao menu
            //menuFormatar.setIcon(R.drawable.icon);
            menuFormatar.setIcon(android.R.drawable.ic_menu_edit);
            
            //caso seja necessário desabilitar o menu Arquivo
            //abaixo segue exemplo
            //menu.findItem(ARQUIVO).setEnabled(false);
    
            menuArquivo.add(ARQUIVO, ARQ_NOVO, 0, "Novo");
            menuArquivo.add(ARQUIVO, ARQ_SALVAR, 1, "Salvar");
            menuArquivo.setIcon(android.R.drawable.ic_menu_more);
            
            //caso seja necessário desabilitar um subitem do menu Arquivo
            //abaixo segue exemplo
            //menuArquivo.findItem(ARQ_NOVO).setEnabled(false);
            
            menuEditar.add(EDITAR, EDITAR_RECORTAR, 0, "Recortar");
            menuEditar.add(EDITAR, EDITAR_COPIAR, 1, "Copiar");
    
            //caso seja necessário desabilitar um subitem do menu Editar
            //abaixo segue exemplo
            //menuEditar.findItem(EDITAR_COPIAR).setEnabled(false);
        }
        catch (Exception e) {
            trace("Erro : " + e.getMessage());
        }            
        return super.onCreateOptionsMenu(menu);        
    }

    //o método abaixo é disparado quando o usuário clicar 
    //em algum dos itens do menu
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //de acordo com o item selecionado você executará
        //a função desejada
        switch (item.getItemId()) {
            case ARQ_NOVO:     
                trace("Você selecionou o menu Novo");
                break;
            case ARQ_SALVAR:     
                trace("Você selecionou o menu Salvar");
                break;
            case EDITAR_COPIAR: 
                trace("Você selecionou o menu Copiar");
                break;
            case EDITAR_RECORTAR: 
                trace("Você selecionou o menu Recortar");
                break;
            case FORMATAR_FONTE: 
                trace("Você selecionou o menu Formatar");
                break;
        }
        return true;
    }    
    
    private void trace (String msg) 
    {
        Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
    }
    
}


Neste exemplo utilizado temos as seguintes opções:
1. menu simples
2. menu com submenu
3. habilitar e desabilitar itens do menu
4. inserir imagens
5. parametrizar tecla de atalho

Como resultado temos as imagens abaixo:
Clicando no botão Menu de seu aparelho será apresentado o Menu raiz, se clicar no item "Arquivo", será exibido um submenu com as opções "Novo" e "Salvar", se clicar na opção "Novo", será exibido a mensagem que você clicou no Menu "Novo".
 
































Espero que seja útil para você este tutorial.



Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.


Desenv com qualidade!

9 comentários:

Letonai disse...

Cara show, seu blog me ajudou na publicação do meu primeiro jogo: http://goo.gl/PfAEF

Abs

Guilherme Telles disse...

Blog muito bom! Continue postando!

Marcio de Souza disse...

Valeu Galera !!!

Fico feliz por gostarem e estar sendo útil como no caso do Letonai.

Até mais...

Adriano Basili disse...

Muito legal o post, mais estou com uma dúvida e se poderia me ajudar:
- Tenho várias telas, exemplo: Cadastro de carro, modelo, etc.
E em cada tela eu gostaria de colocar determinado menu.

Como posso fazer?

grato.

At.

Marcio de Souza disse...

Adriano,

Primeiramente obrigado pela leitura e pelo comentário.

Sobre sua dúvida, você pelo visto deve ter vários arquivos .java, por exemplo, caro.java, modelo,java e etc nesse caso em cada um desses arquivo você cria as rotina onCreateOptionsMenu e onOptionsItemSelected e insere os menus que você precisar.

Qualquer dúvida é só avisar.

Unknown disse...

Bacana seu blog. Poderia me ajudar? Quando o usuario clicar em um item do menu de opções, quero ir para a tela de inserção de dados do veiculo. Não quero isso por meio de um botão na tela, mas por meio do menu nao consigo chamar a tela. Como faço? Obrigado!

Marcio de Souza disse...

Marcelo,

No post: http://escoladeandroid.blogspot.com.br/2012/02/android-criando-uma-agenda-de-contatos.html

é abordado esse assunto.

Obrigado pela visita!

Unknown disse...

Parabens, seu blog é muito util para muitas pessoas. E eu estou aprendendo muito com ele, você publica coisas muito uteis.
Post mais coisas sempre que puder. E novamente parabéns!

Só tenho um pedido, ensine a gente a mexer com o ACELEROMETRO.

Unknown disse...

Qual a versão de android para desenvolver esse menu ?