Aula android 04

Preview:

DESCRIPTION

Quarta aula de Android. Apresentação sobre: -Listagem simples e complexa. -Trabalhando com relacionamentos com o ORMLite -Utilizando a câmera

Citation preview

sábado, 10 de novembro de 12

Desenvolvedor de softwarewww.carloscavalcanti.com

twitter @carloscaval

contato@carloscavalcanti.com

github.com/carloscavalcanti

slideshare.net/carloscavalcanti

sábado, 10 de novembro de 12

sábado, 10 de novembro de 12

sábado, 10 de novembro de 12

Desenvolvedor de 17 anos cria app para iPhone e recebe US$ 1 milhão

Summly é um app para iOS que oferece um leitor de notícias que permite navegar mais rápido. Através de sua tecnologia de inteligência artificial, ele oferece resumos concisos do conteúdo online.

sábado, 10 de novembro de 12

ORMLite

Câmera

Listagem

sábado, 10 de novembro de 12

sábado, 10 de novembro de 12

Criando uma lista simples

sábado, 10 de novembro de 12

O que é necessário?

sábado, 10 de novembro de 12

O que é necessário?

Classe ListActivity

Arquivo XML para exibir conteúdo da linha

Objeto Adapter

sábado, 10 de novembro de 12

Exemplopublic class MainActivity extends ListActivity {

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String nomes[] = new String[]{"João", "Maria", "Cristina", "Marcos", "Eric", "Tâmara", "Joana", "Junior", "Bruna", "André"}; ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.activity_main, nomes); setListAdapter(arrayAdapter); }

}

sábado, 10 de novembro de 12

Ao clicar em um item fazer alguma ação

sábado, 10 de novembro de 12

Evento click

ListView listView = getListView();listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {

Toast.makeText(getApplicationContext(), ((TextView) arg1).getText(), Toast.LENGTH_SHORT).show();

}});

sábado, 10 de novembro de 12

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String nomes[] = new String[]{"João", "Maria", "Cristina", "Marcos",

"Eric", "Tâmara", "Joana", "Junior", "Bruna", "André"}; ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.activity_main,

nomes); setListAdapter(arrayAdapter); ListView listView = getListView(); listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView arg0, View arg1, int arg2,

long arg3) { Toast.makeText(getApplicationContext(), ((TextView)

arg1).getText(), Toast.LENGTH_SHORT).show(); } });

}

Código

sábado, 10 de novembro de 12

sábado, 10 de novembro de 12

Listagem complexa

sábado, 10 de novembro de 12

Vamos imaginar uma classe

Cliente. E vamos exibir

uma lista de clientes

sábado, 10 de novembro de 12

Classe Cliente

public class Cliente { private String nome; private Date dataNascimento;

sábado, 10 de novembro de 12

Layout

sábado, 10 de novembro de 12

Como eu quero exibir os dados?

sábado, 10 de novembro de 12

Precisamos criar um layout para representar

uma linha da nossa listagem

sábado, 10 de novembro de 12

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayoutItem" android:layout_height="wrap_content" android:layout_width="wrap_content" android:gravity="left|center" android:paddingBottom="5sp" android:paddingTop="5sp" android:paddingLeft="5sp"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/txtNome" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="Nome" android:textSize="20sp" android:layout_marginLeft="15sp"/> <TextView android:id="@+id/txtDataNascimento" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="01/01/1999" android:textSize="20sp" android:layout_marginLeft="20sp" /> </LinearLayout></LinearLayout>

sábado, 10 de novembro de 12

E agora precisamos de uma lista

sábado, 10 de novembro de 12

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/base" android:layout_width="fill_parent" android:layout_height="fill_parent" >

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

</LinearLayout>

sábado, 10 de novembro de 12

sábado, 10 de novembro de 12

Será necessário um cara pra organizar nossa lista

sábado, 10 de novembro de 12

Será necessário um cara pra organizar nossa lista

sábado, 10 de novembro de 12

Adapter

sábado, 10 de novembro de 12

sábado, 10 de novembro de 12

Extender de BaseAdapter

sábado, 10 de novembro de 12

Vamos ver como fica

sábado, 10 de novembro de 12

public class ClienteAdapter extends BaseAdapter { private List<Cliente> clientes; private LayoutInflater mInflater; private ViewHolder holder;

static class ViewHolder{ private TextView txtNome; private TextView txtDataNascimento; }

public ClienteAdapter(Context context, List<Cliente> cliente) { mInflater = LayoutInflater.from(context); this.clientes = cliente; }

@Override public int getCount() { return clientes.size(); }

@Override public Object getItem(int index) { return clientes.get(index); }

@Override public long getItemId(int index) { return index; }sábado, 10 de novembro de 12

ViewHolder&

LayoutInflate

sábado, 10 de novembro de 12

@Override public View getView(int posicao, View convertView, ViewGroup arg2) {

if (convertView == null) { convertView = mInflater.inflate(R.layout.cliente_list, null); holder = new ViewHolder();

holder.txtNome = (TextView) convertView.findViewById(R.id.txtNome); holder.txtDataNascimento = (TextView) convertView .findViewById(R.id.txtDataNascimento);

convertView.setTag(holder);

} else { holder = (ViewHolder) convertView.getTag(); }

Cliente cliente = clientes.get(posicao); holder.txtNome.setText(cliente.getNome()); holder.txtDataNascimento.setText(cliente.getDataNascimento().toGMTString());

return convertView; }

}

sábado, 10 de novembro de 12

ListActivity

sábado, 10 de novembro de 12

public class MainActivity extends ListActivity {

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); List<Cliente> clientes = new ArrayList<Cliente>(); clientes.add(new Cliente("Fulaninha", new Date(1999, 3, 12))); clientes.add(new Cliente("Sicrano", new Date(1980, 4, 2))); clientes.add(new Cliente("Beltrano", new Date(1989, 6, 20))); clientes.add(new Cliente("Fulaninha", new Date(1999, 3, 12))); clientes.add(new Cliente("Sicrano", new Date(1980, 4, 2))); clientes.add(new Cliente("Beltrano", new Date(1989, 6, 20))); clientes.add(new Cliente("Fulaninha", new Date(1999, 3, 12))); clientes.add(new Cliente("Sicrano", new Date(1980, 4, 2))); clientes.add(new Cliente("Beltrano", new Date(1989, 6, 20))); clientes.add(new Cliente("Fulaninha", new Date(1999, 3, 12))); clientes.add(new Cliente("Sicrano", new Date(1980, 4, 2))); clientes.add(new Cliente("Beltrano", new Date(1989, 6, 20))); setListAdapter(new ClienteAdapter(this, clientes)); }

}

sábado, 10 de novembro de 12

sábado, 10 de novembro de 12

Data feia :(

sábado, 10 de novembro de 12

Vamos deixa-la bonita, então :)

sábado, 10 de novembro de 12

Vamos lá no nosso Adapter

sábado, 10 de novembro de 12

Vamos mexer aqui

holder.txtDataNascimento.setText(cliente.getDataNascimento().toGMTString());

sábado, 10 de novembro de 12

Ficando assim:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");String dataFormatada = simpleDateFormat.format(cliente.getDataNascimento());holder.txtDataNascimento.setText(dataFormatada);

sábado, 10 de novembro de 12

sábado, 10 de novembro de 12

Exercício

• Criar 1 classe

• Fazer tela de lista para esta classe criada

sábado, 10 de novembro de 12

Relembrando...

sábado, 10 de novembro de 12

DatabaseHelper

sábado, 10 de novembro de 12

Ajudante

sábado, 10 de novembro de 12

DAOData Access Object

sábado, 10 de novembro de 12

Persistindo um objeto

dao.create(objeto);

sábado, 10 de novembro de 12

Buscando todos os objetos

dao.queryForAll()

sábado, 10 de novembro de 12

Buscando por id

dao.queryForId(id)

sábado, 10 de novembro de 12

Buscando por qualquer campo

dao.queryForEq(fieldName, value)

sábado, 10 de novembro de 12

Relacionamento

sábado, 10 de novembro de 12

Vamos imaginar...

sábado, 10 de novembro de 12

Categoria

Produto

Tem

sábado, 10 de novembro de 12

Vamos precisar de 4 classes

2 Classes modelo2 classes DAO

sábado, 10 de novembro de 12

Modelos e DAOs

sábado, 10 de novembro de 12

Categoria

@DatabaseTablepublic class Categoria { @DatabaseField(generatedId=true) private Integer id; @DatabaseField private String descricao;

sábado, 10 de novembro de 12

Categoria DAO

public class CategoriaDao extends BaseDaoImpl<Categoria, Integer>{

public CategoriaDao(ConnectionSource connectionSource) throws SQLException {

super(connectionSource, Categoria.class); }

sábado, 10 de novembro de 12

Produto

@DatabaseTablepublic class Produto {

@DatabaseField(generatedId=true) private Integer id; @DatabaseField private String nome; @DatabaseField(canBeNull = false, foreign = true) private Categoria categoria;

sábado, 10 de novembro de 12

Produto DAO

public class CategoriaDao extends BaseDaoImpl<Categoria, Integer>{

public CategoriaDao(ConnectionSource connectionSource) throws SQLException {

super(connectionSource, Categoria.class); }

sábado, 10 de novembro de 12

Exemplo

DatabaseHelper helper = new DatabaseHelper(this);try { CategoriaDao categoriaDao = new CategoriaDao(helper.getConnectionSource()); ProdutoDao produtoDao = new ProdutoDao(helper.getConnectionSource());

Categoria categoriaComida = new Categoria("Comida"); categoriaDao.create(categoriaComida); Produto produtoSushi = new Produto("Sushi", categoriaComida); produtoDao.create(produtoSushi); Produto produtoPersistido = produtoDao.queryForAll().get(0); System.out.println("Produto: " + produtoPersistido.getNome()); System.out.println("Categoria: "+produtoPersistido.getCategoria().getDescricao()); System.out.println("CategoriaId: "+produtoPersistido.getCategoria().getId());

sábado, 10 de novembro de 12

Vamos ver a saída

sábado, 10 de novembro de 12

Output

I/System.out(21923): Produto: SushiI/System.out(21923): Categoria: nullI/System.out(21923): CategoriaId: 1

sábado, 10 de novembro de 12

ExemploDatabaseHelper helper = new DatabaseHelper(this);try { CategoriaDao categoriaDao = new CategoriaDao(helper.getConnectionSource()); ProdutoDao produtoDao = new ProdutoDao(helper.getConnectionSource());

Categoria categoriaComida = new Categoria("Comida"); categoriaDao.create(categoriaComida); Produto produtoSushi = new Produto("Sushi", categoriaComida); produtoDao.create(produtoSushi); Produto produtoPersistido = produtoDao.queryForAll().get(0); System.out.println("Produto: " + produtoPersistido.getNome()); System.out.println("Categoria: "+produtoPersistido.getCategoria().getDescricao()); System.out.println("CategoriaId: "+produtoPersistido.getCategoria().getId()); categoriaDao.refresh(produtoPersistido.getCategoria()); System.out.println("Refresh"); System.out.println("Produto: " + produtoPersistido.getNome()); System.out.println("Categoria: "+produtoPersistido.getCategoria().getDescricao()); System.out.println("CategoriaId: "+produtoPersistido.getCategoria().getId());

sábado, 10 de novembro de 12

Vamos ver a saída

sábado, 10 de novembro de 12

Output

I/System.out(21923): Produto: SushiI/System.out(21923): Categoria: nullI/System.out(21923): CategoriaId: 1I/System.out(21923): RefreshI/System.out(21923): Produto: SushiI/System.out(21923): Categoria: Comida

sábado, 10 de novembro de 12

Exercício

Faça um relacionamento.Crie 2 classes models e 2

classes DAOs.Persista os dados e consulte-as

imprimindo no log.

sábado, 10 de novembro de 12

Exercício

Quando finalizar, ao invés de mostrar os dados persistidos

no log, faça duas listas.Uma para cada modelo criado.

sábado, 10 de novembro de 12

Câmera

sábado, 10 de novembro de 12

Intent

android.media.action.IMAGE_CAPTURE

sábado, 10 de novembro de 12

Permissão

<uses-permission android:name="android.permission.CAMERA" />

sábado, 10 de novembro de 12

Exemplo

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");startActivity(intent);

sábado, 10 de novembro de 12

Lembrando...

sábado, 10 de novembro de 12

Exemplo<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" >

<Button android:id="@+id/botao" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Chamar Camera" />

</RelativeLayout>

sábado, 10 de novembro de 12

public class MainActivity extends Activity implements OnClickListener { private Button botao;

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); botao = (Button) findViewById(R.id.botao); botao.setOnClickListener(this);

}

@Override public void onClick(View v) { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); startActivity(intent); } }

sábado, 10 de novembro de 12

sábado, 10 de novembro de 12

sábado, 10 de novembro de 12

Vamos fazer o seguinte...

sábado, 10 de novembro de 12

Ao tirar foto, vamos exibi-la em um

ImageView

sábado, 10 de novembro de 12

Como?

sábado, 10 de novembro de 12

onActivityResult

startActivityForResult

sábado, 10 de novembro de 12

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" >

<Button android:id="@+id/botao" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Chamar Camera" />

<ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

</LinearLayout>

sábado, 10 de novembro de 12

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");startActivityForResult(intent, 19);

sábado, 10 de novembro de 12

Recebe

onActivityResult

sábado, 10 de novembro de 12

protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 19) { Bundle bundle = data.getExtras(); if (bundle != null) { Bitmap bitmap = (Bitmap) bundle.get("data"); image.setImageBitmap(bitmap); } } }

sábado, 10 de novembro de 12

sábado, 10 de novembro de 12

Foi salvo uma foto na galeria de fotos do

android.

sábado, 10 de novembro de 12

É possível definir um local para a imagem ir

sábado, 10 de novembro de 12

Utilizando o putExtra na intent.

sábado, 10 de novembro de 12

Utilizando o putExtra na intent.

Lembra dele?

sábado, 10 de novembro de 12

Através do putExtra podemos

passar o local desejado

sábado, 10 de novembro de 12

Vamos lá!

sábado, 10 de novembro de 12

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");File photo = new File(Environment.getExternalStorageDirectory(), "fotxinha.jpg");intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));imageUri = Uri.fromFile(photo);startActivityForResult(intent, 19);startActivity(intent);

sábado, 10 de novembro de 12

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");File photo = new File(Environment.getExternalStorageDirectory(), "fotxinha.jpg");intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));imageUri = Uri.fromFile(photo);startActivityForResult(intent, 19);startActivity(intent);

sábado, 10 de novembro de 12

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");File photo = new File(Environment.getExternalStorageDirectory(), "fotxinha.jpg");intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));imageUri = Uri.fromFile(photo);startActivityForResult(intent, 19);startActivity(intent);

sábado, 10 de novembro de 12

URI

http://www.faqs.org/rfcs/rfc2396.html

http://developer.android.com/reference/android/net/Uri.html

sábado, 10 de novembro de 12

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 19) { Uri selectedImage = imageUri; getContentResolver().notifyChange(selectedImage, null); ImageView imageView = (ImageView) findViewById(R.id.image); ContentResolver cr = getContentResolver(); Bitmap bitmap; try { bitmap = android.provider.MediaStore.Images.Media .getBitmap(cr, selectedImage);

imageView.setImageBitmap(bitmap); Toast.makeText(this, selectedImage.toString(), Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(this, "Falha", Toast.LENGTH_SHORT).show(); Log.e("Camera", e.toString()); }

} }

sábado, 10 de novembro de 12

ExercicioFazer a aplicação tirar uma foto, salvar no lugar

desejado e exibi-la em um imageView

sábado, 10 de novembro de 12

Próxima aulaJackson

Testes automatizados (Unitários e funcionais)

sábado, 10 de novembro de 12