Parâmetros de uma tela para outra com switch

20 respostas
F

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?

20 Respostas

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

É isto?

F

Isso, e como recupero na outra tela?

wagnerfrancisco

No método onCreate:

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

Tá dando null

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

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

F

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?

wagnerfrancisco

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

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

F

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");
wagnerfrancisco

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.

F

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?

wagnerfrancisco

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.

F

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?

F

E ai Wagner beleza, tem msn? O que vc sugere pra ficar mais prático o projeto? O meu é [email removido]

F

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

wagnerfrancisco

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.

F

Tem como fazer um exemplo aqui mesmo disso?

wagnerfrancisco

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

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

F

É 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?

F

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);
    }
F

Wagner,

Seu msn é: [email removido] ? Não tá aparecendo na minha lista.

Criado 27 de agosto de 2012
Ultima resposta 3 de set. de 2012
Respostas 20
Participantes 2