Erro ao clicar em botão

Boa tarde pessoal,

Preciso da ajuda de vocês!

Estou fazendo os exercícios do livro Google Android do capítulo 14 para utilizar no meu trabalho e estou com o seguinte problema.

Na hora de clicar em qualquer botão para chamar outra tela aparece o seguinte log de erro.

11-11 18:36:14.678: E/AndroidRuntime(304): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.livro.android.cap14.banco/br.livro.android.cap14.banco.EditarCarro}: java.lang.ClassCastException: android.widget.Button

Seguem as classes

Classe RepositorioCarrosScript


package br.livro.android.cap14.banco;

import android.content.Context;

public class RepositorioCarrosScript extends RepositorioCarro {

	// script para fazer o drop da tabela
	
	
	private static final String SCRIPT_DATABASE_DELETE = "DROP TABLE IF EXISTS carro";
	
	
	private static final String[] SCRIPT_DATABASE_CREATE = new String[]{
		"create table carro (_id integer primary key autoincrement, nome text not null, placa text not null, ano text not null);",
		"insert into carro(nome, placa, ano) values ('Carro 1','Placa 1','1983');",
		"insert into carro(nome, placa, ano) values ('Carro 2','Placa 2','1543');",
		"insert into carro(nome, placa, ano) values ('Carro 3','Placa 3','1983');"};
		
		
	
	// nme banco
	
	private static final String NOME_BANCO = "livro_android";
	
	// controle versao
	
	private static final int VERSAO_BANCO = 1;
	
	// nome tabela 
	
	public static final String TABELA_CARRO = "carro";
	
	private SQLiteHelper dbHelper;
	
	public  RepositorioCarrosScript(Context ctx){
		
		
		dbHelper = new SQLiteHelper(ctx, RepositorioCarrosScript.NOME_BANCO, 
				RepositorioCarrosScript.VERSAO_BANCO, 
				RepositorioCarrosScript.SCRIPT_DATABASE_CREATE, 
				RepositorioCarrosScript.SCRIPT_DATABASE_DELETE);

		// abre o banco no mode escrita para poder alterar também
		
		db = dbHelper.getWritableDatabase();
		
	
	}
	
// fecha o banco
	
	@Override
	public void fechar(){
		
		super.fechar();
		
		if(dbHelper != null){
			
			dbHelper.close();
			
			
		}
		
	}
	
	
	
	
	
}



RepositorioCarro


package br.livro.android.cap14.banco;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.util.Log;
import br.livro.android.cap14.banco.Carro.Carros;


 * 
 */
public class RepositorioCarro {
	private static final String CATEGORIA = "livro";

	// Nome do banco
	private static final String NOME_BANCO = "livro_android";
	// Nome da tabela
	public static final String NOME_TABELA = "carro";

	protected SQLiteDatabase db;

	public RepositorioCarro(Context ctx) {
		// Abre o banco de dados já existente
		db = ctx.openOrCreateDatabase(NOME_BANCO, Context.MODE_PRIVATE, null);
	}

	protected RepositorioCarro() {
		// Apenas para criar uma subclasse...
	}

	// Salva o carro, insere um novo ou atualiza
	public long salvar(Carro carro) {
		long id = carro.id;

		if (id != 0) {
			atualizar(carro);
		} else {
			// Insere novo
			id = inserir(carro);
		}

		return id;
	}

	// Insere um novo carro
	public long inserir(Carro carro) {
		ContentValues values = new ContentValues();
		values.put(Carros.NOME, carro.nome);
		values.put(Carros.PLACA, carro.placa);
		values.put(Carros.ANO, carro.ano);

		long id = inserir(values);
		return id;
	}

	// Insere um novo carro
	public long inserir(ContentValues valores) {
		long id = db.insert(NOME_TABELA, "", valores);
		return id;
	}

	// Atualiza o carro no banco. O id do carro é utilizado.
	public int atualizar(Carro carro) {
		ContentValues values = new ContentValues();
		values.put(Carros.NOME, carro.nome);
		values.put(Carros.PLACA, carro.placa);
		values.put(Carros.ANO, carro.ano);

		String _id = String.valueOf(carro.id);

		String where = Carros._ID + "=?";
		String[] whereArgs = new String[] { _id };

		int count = atualizar(values, where, whereArgs);

		return count;
	}

	// Atualiza o carro com os valores abaixo
	// A cláusula where é utilizada para identificar o carro a ser atualizado
	public int atualizar(ContentValues valores, String where, String[] whereArgs) {
		int count = db.update(NOME_TABELA, valores, where, whereArgs);
		Log.i(CATEGORIA, "Atualizou [" + count + "] registros");
		return count;
	}

	// Deleta o carro com o id fornecido
	public int deletar(long id) {
		String where = Carros._ID + "=?";

		String _id = String.valueOf(id);
		String[] whereArgs = new String[] { _id };

		int count = deletar(where, whereArgs);

		return count;
	}

	// Deleta o carro com os argumentos fornecidos
	public int deletar(String where, String[] whereArgs) {
		int count = db.delete(NOME_TABELA, where, whereArgs);
		Log.i(CATEGORIA, "Deletou [" + count + "] registros");
		return count;
	}

	// Busca o carro pelo id
	public Carro buscarCarro(long id) {
		// select * from carro where _id=?
		Cursor c = db.query(true, NOME_TABELA, Carro.colunas, Carros._ID + "=" + id, null, null, null, null, null);

		if (c.getCount() > 0) {

			// Posicinoa no primeiro elemento do cursor
			c.moveToFirst();

			Carro carro = new Carro();

			// Lê os dados
			carro.id = c.getLong(0);
			carro.nome = c.getString(1);
			carro.placa = c.getString(2);
			carro.ano = c.getInt(3);

			return carro;
		}

		return null;
	}

	// Retorna um cursor com todos os carros
	public Cursor getCursor() {
		try {
			// select * from carros
			//return db.query(NOME_TABELA, Carro.colunas, null, null, null, null, null, null);
			
			return db.query(NOME_TABELA, Carro.colunas, null, null, null, null, null, null);
		} catch (SQLException e) {
			Log.e(CATEGORIA, "Erro ao buscar dados: " + e.toString());
			return null;
			
			//cursor.getLong(cursor.getColumnIndex
		}
	}

	// Retorna uma lista com todos os carros
	public List<Carro> listarCarros() {
		Cursor c = getCursor();

		List<Carro> carros = new ArrayList<Carro>();

		if (c.moveToFirst()) {

			// Recupera os índices das colunas
			int idxId = c.getColumnIndex(Carros._ID);
			int idxNome = c.getColumnIndex(Carros.NOME);
			int idxPlaca = c.getColumnIndex(Carros.PLACA);
			int idxAno = c.getColumnIndex(Carros.ANO);

			// Loop até o final
			do {
				Carro carro = new Carro();
				carros.add(carro);

				// recupera os atributos de carro
				carro.id = c.getLong(idxId);
				carro.nome = c.getString(idxNome);
				carro.placa = c.getString(idxPlaca);
				carro.ano = c.getInt(idxAno);

			} while (c.moveToNext());
		}

		return carros;
	}

	// Busca o carro pelo nome "select * from carro where nome=?"
	public Carro buscarCarroPorNome(String nome) {
		Carro carro = null;

		try {
			// Idem a: SELECT _id,nome,placa,ano from CARRO where nome = ?
			Cursor c = db.query(NOME_TABELA, Carro.colunas, Carros.NOME + "='" + nome + "'", null, null, null, null);

			// Se encontrou...
			if (c.moveToNext()) {

				carro = new Carro();

				// utiliza os métodos getLong(), getString(), getInt(), etc para recuperar os valores
				carro.id = c.getLong(0);
				carro.nome = c.getString(1);
				carro.placa = c.getString(2);
				carro.ano = c.getInt(3);
			}
		} catch (SQLException e) {
			Log.e(CATEGORIA, "Erro ao buscar o carro pelo nome: " + e.toString());
			return null;
		}

		return carro;
	}

	// Busca um carro utilizando as configurações definidas no
	// SQLiteQueryBuilder
	// Utilizado pelo Content Provider de carro
	public Cursor query(SQLiteQueryBuilder queryBuilder, String[] projection, String selection, String[] selectionArgs,
			String groupBy, String having, String orderBy) {
		Cursor c = queryBuilder.query(this.db, projection, selection, selectionArgs, groupBy, having, orderBy);
		return c;
	}

	// Fecha o banco
	public void fechar() {
		// fecha o banco de dados
		if (db != null) {
			db.close();
		}
	}
}

Carro


package br.livro.android.cap14.banco;

import android.content.ContentUris;
import android.net.Uri;
import android.provider.BaseColumns;

public class Carro {
	
	public static String[] colunas = new String[] {Carros._ID, Carros.NOME, Carros.PLACA, Carros.ANO};
	
	public static final String AUTHORITY = "br.livro.abdroid.prvider.carro";
	
	public long id;
	public String nome;
	public String placa;
	public int ano;
	
	public Carro(){
		
		
	}
	
	
	public Carro(String nome, String placa, int ano) {
		super();
		this.nome = nome;
		this.placa = placa;
		this.ano = ano;
	}
	
	
	public Carro(long id, String nome, String placa, int ano) {
		super();
		this.id = id;
		this.nome = nome;
		this.placa = placa;
		this.ano = ano;
	}
	
	
	/*
	 * classe interna para representar as colunas e ser utilizada por um Content
	 * Proveder
	 * 
	 * 
	 * Filha de BaseColumns que já define (_id e _count), para seguir o padrao
	 * Android
	 * 
	 * */
	
	
	public static final class Carros implements BaseColumns{
		
		private Carros(){
			
			
		}
		
	
	//content://br.livro.android.provider.carro/carros
		
		public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/carros");
		
	//mime type para todos os carros
		
		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.carros";
		
		//mime type para um único carro
		
		public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnc.google.carros";
		
		// ordenacao para inserir no ordem by
		
		public static final String DEFAULT_SORT_ORDER= "_id ASC";
		public static final String NOME = "nome";
		public static final String ANO = "ano";
		public static final String PLACA = "placa";
		
		// metodo que constroi uma Uri para um Carro especifico, com o seu id
		
		// a Uri é no formato "content://br.livro.android.provider.carro/carros/id"
		
		public static Uri getUriId(long id){
			
			Uri uriCarro = ContentUris.withAppendedId(Carros.CONTENT_URI, id);
			
			return uriCarro;
			
		}

		
		
	}


	@Override
	public String toString() {
		return ", Nome: " + nome + ", Placa: " + placa + ", Ano: " + ano;
	}
	
}

	

CadastroCarros



package br.livro.android.cap14.banco;

import java.util.List;

import br.livro.android.cap14.banco.Carro.Carros;


import android.app.ListActivity;

import android.content.Intent;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import android.widget.ListView;

public class CadastroCarros extends ListActivity {
    
	
	
	
	protected static final int INSERIR_EDITAR = 1;
	protected static final int BUSCAR = 2;
	public static RepositorioCarro repositorio;
	private List<Carro> carros;
		
    @Override
    public void onCreate(Bundle icicle) {
        
    	super.onCreate(icicle);
        
        //repositorio = new RepositorioCarro(this);
    	repositorio = new RepositorioCarrosScript(this);
        
        atualizarLista();
       
    }

	protected void atualizarLista() {
		
		carros = repositorio.listarCarros();
		
		setListAdapter(new CarroListAdapter(this, carros));
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu){
	
		super.onCreateOptionsMenu(menu);
		
		menu.add(0,INSERIR_EDITAR,0,"Inserir Novo").setIcon(R.drawable.novo);
		menu.add(0, BUSCAR,0, "Buscar").setIcon(R.drawable.pesquisar);
		
		
		return true;
	
		
	}
	
	
	@Override
	
	public boolean onMenuItemSelected(int featureId, MenuItem item){
		
		switch (item.getItemId()) {
		
		case INSERIR_EDITAR:
			// abre a tela parade cadastro    
			startActivityForResult(new Intent(this, EditarCarro.class), INSERIR_EDITAR);			
		break;

		case BUSCAR:
			// abre a tela para busar 
			startActivity(new Intent(this, BuscarCarro.class));			
		break;
		
		}
		
		return true;
			
	}
	
	@Override
	protected void onListItemClick(ListView l, View v, int posicao, long id){
		
		super.onListItemClick(l, v, posicao, id);
		
		editarCarro(posicao);
			
		
	}

	protected void editarCarro(int posicao) {
		
		Carro carro = carros.get(posicao);
		
		
		// abre a tela para edicao
		
		Intent it = new Intent(this, EditarCarro.class);
		
		// passa o id do carro como parametro
		
		
		it.putExtra(Carros._ID, carro.id);
		
		// abre a a tela de edicao
		
	startActivityForResult(it, INSERIR_EDITAR);
	
	
	}
	
	
	@Override
	protected void onActivityResult(int codigo, int codigoRetorno, Intent it){
		
		super.onActivityResult(codigo, codigoRetorno, it);
				
		// atualizar lista
		
		atualizarLista();
		
		
	}
	
	
	public void onDestroy(){
		
		super.onDestroy();
		
		
		// fecha o banco
		
		repositorio.fechar();
		
	}
	
}

EditarCarro

[code]
package br.livro.android.cap14.banco;

import br.livro.android.cap14.banco.Carro.Carros;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;

public class EditarCarro extends Activity {

static final int RESULT_SALVAR = 1;
static final int RESULT_EXCLUIR = 2;

//Campos texto

private EditText campoNome;
private EditText campoPlaca;
private EditText campoAno;
private Long id;

@Override
protected void onCreate(Bundle icicle){
	
		super.onCreate(icicle);
		
		setContentView(R.layout.form_editar_carro);
		
		campoNome = (EditText) findViewById(R.id.campoNome);
		campoPlaca = (EditText) findViewById(R.id.campoPlaca);
		campoAno = (EditText) findViewById(R.id.campoAno);
		id = null;
		
		Bundle extras = getIntent().getExtras();
		
		// se editar recuperar os valores
		
		if (extras != null) {
			
			
			id = extras.getLong(Carros._ID);
			
			if (id != null) {
				
				// e uma edicao busca o carro
				
				Carro c = buscarCarro(id);
				campoNome.setText(c.nome);
				campoPlaca.setText(c.placa);
				campoAno.setText(String.valueOf(c.ano));
			}
		}
		
		
		ImageButton btCancelar = (ImageButton) findViewById(R.id.btCancelar);
		
		
		btCancelar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View view) {

				setResult(RESULT_CANCELED);
				
				//fecha a tela
				
				finish();
				
			}
		});
		
		
		// listener para salvar carro
		
		ImageButton btSalvar = (ImageButton) findViewById(R.id.btSalvar);
		btSalvar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View view) {
				
				salvar();
				
			}

			
		});
		
		
		ImageButton  btExcluir = (ImageButton) findViewById(R.id.btExcluir);
		btExcluir.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View view) {
				
				excluir();
				
			}
		})
		;
		
}


protected void onPause(){
	
	super.onPause();
	// cancela para não ficar nada na tela pendente
	
	setResult(RESULT_CANCELED);
	
	// fecha a tela
	
	finish();
	
	
}



protected void salvar() {
	
	int ano = 0;
	
	try {
		
		ano = Integer.parseInt(campoAno.getText().toString());
		
	} catch (NumberFormatException e) {
			
	
	}
	
	Carro carro = new Carro();
	
	if (id != null) {
		
		// atualiza
		
		carro.id = id;
		
	}
	
	carro.nome = campoNome.getText().toString();
	carro.placa = campoPlaca.getText().toString();
	carro.ano = ano;
	
	// salvar
	
	salvarCarro(carro);
	
	setResult(RESULT_OK, new Intent());
	
	// fechar a tela
	
	finish();
	
	
}


public void excluir() {
	
	if (id != null) {
		excluirCarro(id);
	}
	
	setResult(RESULT_OK, new Intent());
	
	
	finish();
}





/**CHAMA OS METODOS DA CLASSE REPOSITORIO**/

protected Carro buscarCarro(Long id) {
	// TODO Auto-generated method stub
	return CadastroCarros.repositorio.buscarCarro(id);
}


protected void salvarCarro(Carro carro) {
		
		CadastroCarros.repositorio.salvar(carro);
		
	}


protected void excluirCarro(Long id2) {
	// TODO Auto-generated method stub
	
	CadastroCarros.repositorio.deletar(id);
	
}

}

XML de cadastro - form_editar_carro

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

    <TableLayout
        android:id="@+id/tableLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TableRow
            android:id="@+id/tableRow1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
            
            <TextView android:id="@+id/text1" android:text="Nome: " android:textColor="#ffffff" />
        	<EditText android:id="@+id/campoNome" android:width="240px"/>
        </TableRow>

        <TableRow
            android:id="@+id/tableRow2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        	
            
        </TableRow>
        
            <TextView android:id="@+id/text2" android:text="Placa: " android:textColor="#ffffff" />
        	<EditText android:id="@+id/campoPlaca" />

        <TableRow
            android:id="@+id/tableRow3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </TableRow>
        
            <TextView android:id="@+id/text3" android:text="Ano: " android:textColor="#ffffff" />
        	<EditText android:id="@+id/campoAno" />

        <TableRow
            android:id="@+id/tableRow4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </TableRow>
        
            <ImageButton
	        android:src="@drawable/cancelar"
	        android:id="@+id/btCancelar"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="Cancelar" />
	
	    <ImageButton
	        android:src="@drawable/salvar"
	        android:id="@+id/btSalvar"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="Salvar" />
	
	
	    <Button
	        android:src="@drawable/excluir"
	        android:id="@+id/btExcluir"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="Excluir" />
    </TableLayout>

</LinearLayout>

Preciso de uma luz pessoal.

Desde já agradeço muito pela força.

Oi Fabiano,

O seu botão excluir no xml é um Button e no EditarCarro você faz um cast para ImageButton. É só ver qual realmente você quer…

Era isso?

Abraço