Upload
carlos-cavalcanti
View
894
Download
1
Embed Size (px)
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
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