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.