Chamar outra tela ao clicar no item da lista

Meus amigos,

Tenho uma lista com os dados carregados do banco. Ao clicar no nome, abre a Tela de Cadastro Clientes para Alterar ou Excluir, ok? Como fazer para chamar outra Tela no caso Cadastro Veículos para não ter fazer outra tela?

No código abaixo, chama a Tela Cadastro Clientes, para alterar ou excluir.

    // Clicar em item da lista e mostra nos campos da tela de cadastro
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
    	super.onListItemClick(l, v, position, id);
		Intent intent = new Intent(Lista.this, CadastrarCliente.class);
		intent.putExtra(DbAdapter.KEY_IDCLI, id);
		startActivityForResult(intent, 1);
    }

Tem como fazer chamar outra a Tela Cadastro Veiculo? Obrigado.

Você vai ter um botão na tela de cadastro de clientes para abrir cadastro de veículos?

Ou vai ser uma opção a mais na lista de clientes? Tipo, ele pressionar e ter a opção de ir para cadastro de clientes ou veículos.

Quero escolher a tela. Na mosca. Lembrando que é uma ListActivity. Como fazer?

Para isso você pode usar o menu de contexto. Assim, quando o usuário “clicar” no registro e segurar por um tempo, vai aparecer as opções.

Se você ver no link da documentação que lhe passei, há 3 etapas. Registrar o menu, adicionar as opções ao menu e executar as ações quando o usuário clicar no botão selecionado.

Então, to usando o método:


 // Clicar em item da lista e mostra nos campos da tela de cadastro  
  @Override  
  protected void onListItemClick(ListView l, View v, int position, long id) {  
    super.onListItemClick(l, v, position, id);  
Intent intent = new Intent(Lista.this, CadastrarCliente.class);  
intent.putExtra(DbAdapter.KEY_IDCLI, id);  
startActivityForResult(intent, 1);  
  }  

Tenho que criar uma pasta menu, certo? Passa de novo o link, por favor?

Então, fiz aqui esse método para deletar.

    @Override
    public boolean onContextItemSelected(MenuItem item) {
    	switch(item.getItemId()){
    	case R.id.menu_delete:
    		db.open();
    		if(db.apagarCliente(((AdapterContextMenuInfo)item.getMenuInfo()).id))    				
    			carregarLista();
    		return true;
    	default: return super.onContextItemSelected(item);	
    		
  	}

Fiz assim:

    @Override
    public boolean onContextItemSelected(MenuItem item) {
    	switch(item.getItemId()){
    	case R.id.menu_delete:
    		db.open();
    		if(db.apagarCliente(((AdapterContextMenuInfo)item.getMenuInfo()).id))    				
    			carregarLista();
    		return true;
    		//startActivity(new Intent(this,CadastrarCliente.class)); break;
    	case R.id.menu_carro:
    		startActivity(new Intent(this,CadastrarCarro.class)); 
                return true;
//    	case 2:
//    		startActivity(new Intent(this,Lista.class)); break;
    	default: return super.onContextItemSelected(item);	
    		
    	}
    }

Wagner, funcionou o que eu fiz, só que não mostrou na outra tela o id e o nome do item selecionado.

Você tem que passar os dados do carro pra tela CadastrarCarro. Pra isto, se usa um extra. Você pode passar o objeto desta maneira:

case R.id.menu_carro:
   Intent intent = new Intent(this, CadastrarCarro.class);
   intent.putExtra("meuObjeto", meuObjeto);
   startActivity(intent);

O meuObjeto é o que vc vai mandar. Não sei se tua classe CadastrarCarro espera um id, ou um objeto carro…

Assim:

    @Override
    public boolean onContextItemSelected(MenuItem item) {
    	switch(item.getItemId()){
    	case R.id.menu_delete:
    		db.open();
    		if(db.apagarCliente(((AdapterContextMenuInfo)item.getMenuInfo()).id))    				
    			carregarLista();
    		return true;
    	case R.id.menu_carro:
    		Intent intent = new Intent(Lista.this, CadastrarCarro.class);
    		intent.putExtra(DbAdapter.KEY_IDCLI, item.getItemId());
    		startActivityForResult(intent, 1);
    		return true;
    	default: return super.onContextItemSelected(item);	
    	}
    }

Na classe CadastrarCarro, ta assim:


public class CadastrarCarro extends Activity { // Início da Classe CadastrarCliente
	private long mId;
	private EditText Nome, Placa, Modelo;
	private TextView IdNome;
	private ImageButton salvar, pesquisar, limpar, voltar;
	
	private DbAdapter mDb;
	
	@Override
	protected void onCreate(Bundle icicle){ // Início do método onCreate
		super.onCreate(icicle);
		setContentView(R.layout.cad_carros);
		
		mDb = new DbAdapter(this);
		
		mId = getIntent().getLongExtra(DbAdapter.KEY_IDCLI, 0);
		Log.d("CarrosCliente", "mId: " + mId); //aqui 
		
		IdNome = (TextView) findViewById(R.id.IdNome);		
		Nome = (EditText) findViewById(R.id.edtNome);
		Placa = (EditText) findViewById(R.id.edtPlaca);
		Modelo = (EditText) findViewById(R.id.edtModelo);
	
		
		mDb.open();
		
		Cursor cliente = mDb.getCliente(mId);
		
		if(mId > 0 && cliente.moveToFirst()){ 
		  IdNome.setText(cliente.getString(cliente.getColumnIndex(DbAdapter.KEY_IDCLI)));
		  Log.d("CarrosCliente", "mId: " + mId); // e aqui 
		  Nome.setText(cliente.getString(cliente.getColumnIndex(DbAdapter.KEY_NOME)));
		} 
		
		// Código do botão Salvar da Tela de Cadastro de Clientes
		salvar = (ImageButton) findViewById(R.id.btSalvar);

		salvar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
//				int idclienteInteger = Integer.parseInt(IdNome.getText().toString());
				String placaString = Placa.getText().toString();
				String modeloString = Modelo.getText().toString();
				String idclienteString = IdNome.getText().toString();
				mDb.open();
				if(Nome.getText().toString().equals("") || Placa.getText().toString().equals("")){
					mensagemExibir("Erro ao Salvar","Nome OU Placa em branco, verifique!");
					return;
				}
				
				mDb.gravarCarroCliente(modeloString, placaString, idclienteString);
				mensagemExibir("Salvar","Veículo cadastrado com sucesso!");
				mDb.close();
			}
		});

		// Código do botão Cancelar da Tela de Cadastro de Clientes
		pesquisar = (ImageButton) findViewById(R.id.btPesquisar);
		pesquisar.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				mDb.open();
				if(Nome.getText().toString().equals("")){
					mensagemExibir("Erro ao Pesquisar","Dados em branco, verifique!");
					return;
				}
				
				String nomeString = Nome.getText().toString();
				Cursor cliente = mDb.getClientePorNome(nomeString);
				while(cliente.moveToNext()){
					IdNome.setText(" "+cliente.getString(cliente.getColumnIndex("_id")));
					Nome.setText(cliente.getString(cliente.getColumnIndex("nome")));
				}
				mDb.close();
			}
		});
		
		limpar = (ImageButton) findViewById(R.id.btLimpar);
		
		limpar.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
			  Nome.setText("");
			}
		});

		
		// Código do botão Cancelar da Tela de Cadastro de Clientes
		voltar = (ImageButton) findViewById(R.id.btVoltar);

		// Início do setOnClickListener. Volta para a Tela Principal
		voltar.setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				setResult(RESULT_CANCELED);
				// Fecha a tela
				finish();
			}
		}); // Fim do setOnClickListener
		
	} // Fim do método onCreate

	 public void mensagemExibir(String titulo, String texto){
	    	AlertDialog.Builder mensagem = new AlertDialog.Builder(CadastrarCarro.this);
	    	mensagem.setTitle(titulo);
	    	mensagem.setMessage(texto);
	    	mensagem.setNeutralButton("Ok", null);
	    	mensagem.show();
	 }
	
} // Fim da Classe CadastrarCarro

Wagner, na classe CadastrarCarro tem esse trecho recupera o id, certo? No logCat, o mId tá vindo 0:

mId = getIntent().getLongExtra(DbAdapter.KEY_IDCLI, 0);
Log.d("CarrosCliente", "O mId é: " + mId);

Você precisa recuperar o id do objeto que colocou na lista. O id do Menu não é o id do seu objeto.

@Override
public boolean onContextItemSelected(MenuItem item) {
   switch(item.getItemId()){
      //...
      case R.id.menu_carro:
         int position = ((AdapterContextMenuInfo)item.getMenuInfo()).position;
         // agora vc precisa recuperar o objeto com base na posicao
         // vc busca ele no seu adapter. eh um ArrayAdapter? Um CursorAdapter?
      //...
   }
}

Fiz assim:

    	case R.id.menu_carro:
    		db.open();
    		Intent intent = new Intent(this, CadastrarCarro.class);
    		intent.putExtra(DbAdapter.KEY_IDCLI, ((AdapterContextMenuInfo)item.getMenuInfo()).id);
     		startActivity(intent);

Eu tenho uma dúvida. Quero fazer uma consulta agora por nome de cliente e mostrar os carros do mesmo. Já tenho a tela com a lista. Tem como aproveitar a tela mudando somente a sql?

Sim, você pode fazer uma consulta que retorne em outro cursor e utilizá-lo no adapter:

cursor = mDb.consultaBlaBlaBla();
adapter.changeCursor(cursor);

Ok e como fazer o listView aparecer 03 linhas, o padrão são duas ou concatenar, exemplo:

Nome + Celular +


Cursor clientes = db.getClientePorNome(nomeString);
 
clientes.moveToFirst();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.two_line_list_item, clientes, new String[] {DbAdapter.KEY_NOME, DbAdapter.KEY_CELULAR}, new int[] {android.R.id.text1, android.R.id.text2});

Você pode criar o seu próprio layout para a linha. Quando você faz:

new SimpleCursorAdapter(this, android.R.layout.two_line_list_item, clientes, new String[] {DbAdapter.KEY_NOME, DbAdapter.KEY_CELULAR}, new int[] {android.R.id.text1, android.R.id.text2});

Está especificando que vai usar o layout android.R.layout.two_line_list_item. Você pode criar outro do jeito que você quiser. Abra este layout do Android no eclipse para ver como é e posteriormente crie o seu com base nele.

Dá pra fazer tres linhas usando esse exemplo? Não to conseguindo fazer… Dá pra criar mais uma linha no listview usando o android.R.layout, do jeito que está? Como fazer se caso não der?

Tenho que criar um novo xml ou posso aproveitar a lista que ja está lá? Estou usando ListActivity.

No meu xml onde está a lista tá assim:

    <ListView
        android:id="@+id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ListView>

Pode criar um layout padrão com alguns TextView e mostrar os campos de acordo com a consulta? Exemplo:

05 TextViews no layout e a consulta retorna 03 campos, vai dar erro se fizer assim?

Cara estou com o mesmo problema quando clico na minha View da erro. Segue meu código.
O mais estranho é que quando eu troco o código > ViagemActivity.class por LoginActivity.class funciona normalmente. o cliente é direcionado para a página. Por favor, poderiam me dar uma Luz?
Pessoal, caso seja um erro grotesto(idiota) desculpem, pois sou novo em android e estou estudando ainda.

Obrigado.

//Minha classe Index

[code]public class IndexActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_index);
}

public void selecionarOpcao(View view){
	
	switch(view.getId()){
		case R.id.nova_viagem:startActivity(new Intent(this, ViagemActivity.class));
		break;
	}
}

}[/code]

Meu xml(layout) da classe Index

&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#333333"
    android:orientation="vertical" &gt;

    &lt;TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="@string/app_name"
        android:textAppearance="?android:attr/textAppearanceLarge" /&gt;

    &lt;RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#015488" &gt;

        &lt;TextView
            android:id="@+id/novo_gasto"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="50dp"
            android:layout_marginTop="80dp"
            android:clickable="true"
            android:drawableTop="@drawable/novo_gasto"
            android:onClick="selecionarOpcao"
            android:text="@string/app_mensagem_novo_gasto"
            android:textColor="#FFFFFF"
            android:textStyle="bold" /&gt;

        &lt;TextView
            android:id="@+id/nova_viagem"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignTop="@id/novo_gasto"
            android:layout_marginRight="50dp"
            android:clickable="true"
            android:drawableTop="@drawable/nova_viagem"
            android:onClick="selecionarOpcao"
            android:text="@string/app_mensagem_nova_viagem"
            android:textColor="#FFFFFF"
            android:textStyle="bold" /&gt;
        
	        &lt;TextView
			android:id="@+id/minhas_viagens"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:layout_alignLeft="@id/novo_gasto"
			android:layout_alignParentBottom="true"
			android:layout_marginBottom="120dp"
			android:clickable="true"
			android:drawableTop="@drawable/minhas_viagens"
			android:onClick="selecionarOpcao"
			android:text="@string/app_mensagem_minhas_viagens"
			android:textColor="#FFFFFF"
			android:textStyle="bold"/&gt;
	        
	         &lt;TextView
			android:id="@+id/configuracoes"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:layout_alignBottom="@id/minhas_viagens"
			android:layout_alignRight="@id/nova_viagem"
			android:clickable="true"
			android:drawableTop="@drawable/configuracoes"
			android:onClick="selecionarOpcao"
			android:text="@string/app_mensagem_configuracoes"
			android:textColor="#FFFFFF"
			android:textStyle="bold"/&gt;
	        
    &lt;/RelativeLayout&gt;
&lt;/LinearLayout&gt;

//Minha classe Login

[code]
public class LoginActivity extends Activity {

private EditText usuario;
private EditText senha;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_login);
	
	usuario = (EditText)findViewById(R.id.campo_usuario);
	senha = (EditText)findViewById(R.id.campo_senha);
}

public void entrarOnClick(View v) {
	
	String retornoUsuario = usuario.getText().toString();
	String retornoSenha = senha.getText().toString();
	
	if(retornoUsuario.equals(&quot;admin&quot;) && retornoSenha.equals(&quot;admin&quot;)){
		startActivity(new Intent(this,IndexActivity.class));
		
	}else{
		String msg = getString(R.string.app_erro_autenticacao);
		Toast toast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
		toast.show();
		
	}
}

}[/code]

//Meu xml do login.

[code]<?xml version=“1.0” encoding=“utf-8”?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation=“vertical” >

&lt;ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="50dp"
android:src="@drawable/logo" /&gt;

&lt;TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/app_label_usuario"
    /&gt;

&lt;EditText
    android:id="@+id/campo_usuario"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="text"&gt;
    &lt;requestFocus /&gt;
&lt;/EditText&gt;

&lt;TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/app_label_senha"
   /&gt;

&lt;EditText
    android:id="@+id/campo_senha"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textPassword"
    /&gt;

&lt;Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:onClick="entrarOnClick"
    android:text="@string/app_label_buton"
    /&gt;		

</LinearLayout>[/code]

Olá pessoal sou iniciante em programação Android, e estou com uma dificuldade em CheckBoxs e nova tela(fragmento).

Resumidamente, tenho uma tela(Fragmento) [chamaremos de Tela1] com varios Checkboxs são como se fosse “categorias” de algo, e ao selecionar elas e depois clicar no botão Avançar deve abrir a Tela2 onde deve conter as “subcategorias” de cada uma das categorias selecionadas na Tela1 e tbm tem que ser em formato de Checkboxs.

Como faço pra criar estas Telas (Fragmentos) que interagem (avançando e voltando)?
E como faço para a informações (subcategorias) do meus checkboxs selecionados na Tela1 apareçam na Tela2 em formato de novos checkboxs?

P.S.: lembrando que posso selecionar de um à varios checkboxs, que são as categorias [na Tela1], e cada um delas tem de 1 à varios subcategorias que irão aparecer na segunda tela [Tela2] (somente as das categorias selecionadas) como checkboxs.