Parâmetros de uma tela para outra com switch

Meus amigos,

Estou com o seguinte problema: Tenho um menu numa ListView, gostaria de passar o item do menu clicado para outra tela para chamar a consulta corresponde ao item clicado. Todas consultas chamam a mesma classe mudando somente a sql.

Código do menu:

String[] items = new String[] {"1 - Cadastro Clientes", "2 - Cadastro Veículos", " 3 - Listar Clientes",
        		  "4 - Listar Carros Cliente", "5 - Sair"};
        ArrayAdapter<String> arrayAdapter = 
        	new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
        setListAdapter(arrayAdapter);

Selecionar o item e chamar a Lista:

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
    	super.onListItemClick(l, v, position, id);
    	Object objetoSelecionado = this.getListAdapter().getItem(position);
    	String itemMenu = objetoSelecionado.toString(); // Aqui pego o item
    	Toast.makeText(this, "Você selecionou: " + itemMenu, Toast.LENGTH_SHORT).show();
    	switch(position){
    	case 0:
    		startActivity(new Intent(this,CadastrarCliente.class)); break;
    	case 1:
    		startActivity(new Intent(this,CadastrarCarro.class)); break;
    	case 2:
    		startActivity(new Intent(this,Lista.class)); break;
    	case 3:
    		startActivity(new Intent(this,Lista.class)); break;
    	default: finish();	
    	}
    }

A variável itemMenu pega o item do menu. Como passar o valor da variável para Lista.class. Sei que tem que usar putExtra(); Mas como usar nesse caso?

case 2:  
   Intent intent = new Intent(this, Lista.class);
   intent.putExtra("itemMenu", itemMenu);
   startActivity(intent);
   break;  

É isto?

Isso, e como recupero na outra tela?

No método onCreate:

String itemMenu = getIntent().getStringExtra("itemMenu");

Tá dando null

String itemMenu = getIntent().getStringExtra("itemMenu");  
        Toast.makeText(this, "Você selecionou: " + itemMenu, Toast.LENGTH_SHORT).show();

Não entendi bem esta consulta, pode explicar melhor?

Tenho a lista de menus, certo?

1 - Cadastro Clientes
2 - Cadastro Veículos
3 - Listar Clientes
4 - Listar Carros Cliente
5 - Sair

Se escolher a opção 3, na Lista executar a consulta Listar Clientes e assim vai. Só que tá retornando null o valor do itemMenu.

Intent dados = getIntent();
        
String itemMenu = getIntent().getStringExtra("itemMenu");  
Toast.makeText(this, "Você selecionou: " + itemMenu, Toast.LENGTH_SHORT).show();

O que fiz errado?

Você tá executando isto no método onCreate?

Como ficou a chamada? Na hora que vc adicionou o extra com putExtra…

Sim,

Na classe MenuListaActivity ta assim:

  @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
    	super.onListItemClick(l, v, position, id);
    	Object objetoSelecionado = this.getListAdapter().getItem(position);
    	String itemMenu = objetoSelecionado.toString();
    	switch(position){
    	case 0:
    		startActivity(new Intent(this,CadastrarCliente.class)); break;
    	case 1:
    		startActivity(new Intent(this,CadastrarCarro.class)); break;
    	case 2:
    		Intent intent = new Intent(this, Lista.class);  
   		    intent.putExtra("itemMenu", itemMenu);
    		startActivity(new Intent(this,Lista.class)); break;
    	case 3:
    		startActivity(new Intent(this,Lista.class)); break;
    	default: finish();	
    	}
    }

No onCreate da Lista.class tá:

	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lista_layout);
        
        String itemMenu = getIntent().getStringExtra("itemMenu");  

No case 2, perceba que você criou a intent mas não passou ela no método startActivity. Você criou outro objeto ao invés disso, e por isso o extra não está chegando na Lista.

Assim?

 case 2:
     Intent intent = new Intent(this, Lista.class);  
     intent.putExtra("itemMenu", itemMenu);
     startActivity(intent); break;

Como fazer pra pegar somente as letras do menu, sem o número?

Tem várias maneiras. Me parece gambiarra o que você tá querendo fazer… mas enfim, se você garante que vai usar o mesmo padrão, pode usar o método substring para pegar somente a partir de um determinado caractere:

itemMenu.substring(3);

Isto pegaria somente a string a partir do terceiro caractere.

Wagner, pior que é, porque não vi outro jeito de fazer. Você tem alguma ideia de como fazer do modo correto?

To fazendo assim na classe Lista:

   	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lista_layout);
        String opcao;
        String itemMenu = getIntent().getStringExtra("itemMenu");  
        itemMenu.length();
        opcao = itemMenu.substring(4, itemMenu.length());
        Log.d("Valor", "Opção    : " + opcao);
        
        db = new DbAdapter(this);

        if (opcao == "Listar Clientes"){
        	carregarLista();
        	Log.d("Valor", "Valor passado: " + opcao);
        }	

        }

No método carregarLista, faria a consulta Listar Clientes, só que não faz essa consulta, fiz um log na opcao, está igual o que está entre aspas, só que não faz nada.

Consegui utilizando equals. Teria uma sugestão para não fazer gambiarra?

E ai Wagner beleza, tem msn? O que vc sugere pra ficar mais prático o projeto? O meu é frederico.brigatte@itelefonica.com.br

E ai Wagner beleza? Tem alguma sugestão para não ser gambiarra?

Uma solução simples seria definir algumas constantes na classe Lista:

public class Lista extends ListActivity {
   public static final String CADASTRO_CLIENTES = "Cadastro Clientes";
   public static final String CADASTRO_VEICULOS = "Cadastro Veículos";
   //...

   public void onCreate(Bundle savedInstanceState) {
      //...
      if (CADASTRO_CLIENTES.equals(opcao) { //nao esqueca de comparar strings com equals ao inves de ==
          //...
      }
   }

Mas o ideal é usar enums para definir as constantes e definir as strings da tua aplicação num arquivo próprio (strings.xml), o que facilita na internacionalização. Dê uma procurada sobre isto.

Tem como fazer um exemplo aqui mesmo disso?

Po… dá uma procura sobre enums aqui no fórum mesmo, vai achar muita coisa…

Se não tentar, não vai aprender…

É verdade, aprendi muita coisa com você. Só pra adiantar, o que são enums, tem pra android aqui no forum? Tem algum link sobre isso pra dar uma olhada?

Wagner,

Isso seria um enum:


public static final String ItemMenu_1 = "Listar todos Clientes";
public static final String ItemMenu_2 = "Listar Carros Cliente";
public static final String ItemMenu_3 = "Listar Carros por Placa";
public static final String ItemMenu_4 = "Listar Carros por Cliente";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String[] items = new String[] {"1 - Cadastro Clientes", 
        		                       "2 - Cadastro Veículos", 
        		                       "3 - " + ItemMenu_1,
        		                       "4 - " + ItemMenu_2, 
        		                       "5 - " + ItemMenu_3, 
        		                       "6 - " + ItemMenu_4, 
        		                       "7 - Sair"};
        ArrayAdapter<String> arrayAdapter = 
        	new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
        setListAdapter(arrayAdapter);
    }