Por Mário Baltazar para o Pplware
Tutorial realizado no âmbito do Mestrado em Computação Móvel do Instituto Politécnico da Guarda na Unidade Curricular de Seminário
A plataforma Android foi introduzida no mercado pela Google em 2007 e é composta por um sistema operativo embebido e um conjunto de aplicações que integram com a plataforma. Além das várias inovações implementadas, o Android traz também suporte nativo para o SQLite. O SQLite é uma pequena biblioteca, desenvolvida em linguagem C, que implementa um amplo subconjunto do standard SQL 92, sendo a sua reputação proveniente da combinação do motor de base de dados com a interface dentro de uma única biblioteca.
Este artigo será dividido em duas partes e depois de termos ensinado a criar criar as classes para interagir com o sqlite, hoje vamos proceder à criação da aplicação.
No tutorial anterior deixamos as classes auxiliares para ligar à base de dados prontas a serem “consumidas” pela nossa aplicação, vamos agora ver como as iremos utilizar.
5 – vamos desenhar inicial que irá listar os contactos existentes na base de dados e terá um botão que permitirá adicionar um novo Contacto.
5.1 – Abrir o ficheiro main.xml e alterar o layout para o seguinte:
6 – Vamos criar um novo Layout com o nome: “contacto_list_item” onde iremos definir a forma como cada item da lista será mostrado.
7 – Vamos agora alterar a classe ContactosActivity.java para listar os contactos existentes na base de dados.
import android.app.ListActivity;
import android.os.Bundle;
public class ContactosActivity extends ListActivity {
ListAdapter adapter;
DBAdapter datasource;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
datasource = new DBAdapter(this);
datasource.open();
Cursor cursor = datasource.getContactos();
String[] columns = new String[] { "nome","telefone" };
int[] to = new int[] { R.id.nome, R.id.telefone};
adapter = new SimpleCursorAdapter(this, R.layout.contacto_list_item,
cursor,
columns,
to);
this.setListAdapter(adapter);
datasource.close();
}
}
- ListAdapter permite mostrar várias informações em uma linha do ListView.
- DBAdapter permite fazer operações na base de dados.
8 – Adicionar Novo contacto Vamos agora permitir que na nossa aplicação possa adicionar contactos.
8.1 – Acrescentar um layout com o nome novocontacto.xml
Código do layout:
9 – Vamos agora acrescentar uma activity no ficheiro AndroidManifest.xml
10 – Alterar o ficheiro ContactoActivity para passar para o ecrã NovoContacto. 10.1 – Criar variável para aceder ao botão Novo Contacto:
Button btNovoContacto;
10.2 – Criar ligação entre botão e o elemento da interface, e adicionar a acção que irá fazer o botão, no método onCreate:
btNovoContacto = (Button) findViewById(R.id.btNovoContacto);
btNovoContacto.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent novo = new Intent("mbaltazar.contactos.NovoContacto");
startActivity(novo);
}
});
11- Acrescentar nova classe chamada NovoContacto e indicar que expande a classe Activity
public class NovoContacto extends Activity {
}
11.1 – Acrescentar o método onCreate e alterar o parâmetro do método setContentView para indicar o novo ficheiro de layout novocontacto.xml como o layout da nova Activity.
public class NovoContacto extends Activity {
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.novocontacto);
}
}
11.2 – Criar variáveis para aceder aos elementos da interface Novo Contacto:
Button btadicionar;
Button btTirarFoto;
EditText edtNome;
EditText edtEmail;
EditText edtTelefone;
ImageView iv;
final static int cameraData = 0;
11.3 – No evento onCreate criar a ligação entre as variáveis e os elementos da interface:
edtNome = (EditText) findViewById(R.novocontacto.ednome);
edtEmail = (EditText) findViewById(R.novocontacto.edEmail);
edtTelefone = (EditText) findViewById(R.novocontacto.edTelefone);
btadicionar = (Button) findViewById(R.novocontacto.btadicionar);
btTirarFoto = (Button) findViewById(R.novocontacto.tirarFoto);
iv = (ImageView) findViewById(R.novocontacto.ivReturnedPic);
11.4 – Adicionar, no método onCreate, a acção do botão tirar Foto:
btTirarFoto.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i= new
Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i,cameraData);
}
});
11.5 – Adicionar o método onActivityResult, quando for tirada a fotografia é apresentada a imagem no controlo imageView:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if(resultCode == RESULT_OK){
Bundle extras = data.getExtras();
Bitmap bmp = (Bitmap) extras.get("data");
iv.setImageBitmap(bmp);
}
super.onActivityResult(requestCode, resultCode, data);
}
11.6 – Adicionar uma instância da classe DBAdapter
private DBAdapter datasource;
11.7 – inicializar datasource no método onCreate
datasource = new DBAdapter(this);
11.8 – Alterar o método onCreate e adicionar a acção do botão Adicionar:
btadicionar.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
datasource.open();
Contacto c = datasource.createContacto(edtNome.getText().toString(),
edtEmail.getText().toString(),
edtTelefone.getText().toString(),loadBitmapFromView(iv));
datasource.close();
AlertDialog.Builder dialogo = new
AlertDialog.Builder(NovoContacto.this);
dialogo.setTitle("Aviso");
dialogo.setMessage("Contacto:" + c.getNome());
dialogo.setNeutralButton("OK", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id) {
finish();
}
});
dialogo.show();
}
});
11.9 – Adicionar um método adicional para retornar o bitmap da imageView:
public static Bitmap loadBitmapFromView(View v) {
Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width,
v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}
Com este código já é permitido adicionar um contacto à base de dados.
12 – Vamos agora alterar na classe ContactosActivity para que no final de adicionarmos o contacto este já seja apresentado na lista:
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
datasource.open();
Cursor cursor = datasource.getContactos();
String[] columns = new String[] { "nome","telefone" };
int[] to = new int[] { R.id.nome, R.id.telefone};
adapter = new SimpleCursorAdapter(
this,
R.layout.contacto_list_item,
cursor,
columns,
to);
this.setListAdapter(adapter);
datasource.close();
}
12.1 – Vamos adicionar o método onListItemClick, método que é chamado sempre que é clicado um item da lista:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent intent = new Intent("com.contactos.DetalhesContacto");
Cursor cursor = (Cursor) adapter.getItem(position);
intent.putExtra("idContacto",cursor.getInt(cursor.getColumnIndex("_id")));
startActivity(intent);
}
13 – criar a interface para ver os detalhes do contacto. 13.1 – Criar um novo ficheiro com o nome detalhecontacto.xml e alterar o ficheiro com o seguinte layout:
No final a interface ficará com o seguinte aspecto:
14 – De seguida vamos acrescentar a nova activity para mostrar os detalhes do contacto:
15 – Adicionar nova classe com nome Contactos Detalhes, esta vai expandir a classe Activity:
public class DetalhesContacto extends Activity {
}
15.1 – Acrescentar o método onCreate e alterar o parâmetro do método setContentView para indicar o novo ficheiro de detalhecontacto.xml como o layout da nova Activity DetalheContacto.
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.detalhecontacto);
}
15.2 – Criar variáveis para aceder aos elementos da interface:
int idContacto;
ContactoDataSource datasource;
Contacto contacto;
TextView edtNome;
TextView edtEmail;
TextView edtTelefone;
Button btVoltar;
Button btEliminar;
ImageView ivFoto;
15.3 – No evento onCreate criar a ligação entre as variáveis da classe e os elementos da interface.
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.detalhecontacto);
edtNome = (TextView) findViewById(R.lista.txtnome);
edtEmail = (TextView) findViewById(R.lista.txtEmail);
edtTelefone = (TextView) findViewById(R.lista.txtTelefone);
ivFoto = (ImageView) findViewById(R.id.ivFoto);
btEliminar = (Button) findViewById(R.id.btEliminar);
btVoltar = (Button) findViewById(R.lista.btmenu);
}
15.4 – Adicionar um nova função que irá colocar nos elementos da interface os detalhes do contacto:
private void carregaDetalhesContacto(){
idContacto = getIntent().getIntExtra("idContacto", 0);
datasource = new DBAdapter(this);
datasource.open();
contacto = datasource.getContacto(idContacto);
datasource.close();
ivFoto.setImageBitmap(contacto.getFoto());
edtNome.setText(contacto.getNome());
edtEmail.setText(contacto.getEmail());
edtTelefone.setText(contacto.getTelefone());
}
15.5 – Chamar a função carregaDetalhesContacto() na função onCreate.
15.6 – Adicionar à função onCreate a acção dos botões da interface:
btVoltar.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
btEliminar.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
AlertDialog.Builder dialogo = new
AlertDialog.Builder(ContactosDetalhes.this);
dialogo.setTitle("Aviso");
dialogo.setMessage("Eliminar Contacot?");
dialogo.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
dialogo.setPositiveButton("Eliminar",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
datasource.open();
datasource.EliminaContacto(idContacto);
datasource.close();
finish();
}
});
dialogo.show();
}
});
Com isto terminamos a nosso pequena aplicação de registo de contactos utilizando o sqlite.