Gosto muito desse livro principalmente por ser muito prático, a teoria foi embutida dentro dos projetos, assim os leitores podem aprender criando. Obviamente que o período de criação não para então vou aproveitar este blog para dar continuação a mais alguns projetos e tentar passar mais algumas teorias que não foram vistas no livro.
Não, você não precisa comprar o livro para usar estes projetos. Basta ir no meu site e na seção do Curso Android e baixar gratuitamente os 8 tutoriais introdutórios.
Ficha do Projeto 51
Nome do Projeto: FaltamPlataforma: Android 2.3.3 (Honeycomb)
Nome do Pacote: projeto.livro.faltam
Nome da Atividade: MainActivity
Versão mínima do SDK: 10
Uma grande preocupação que sempre tive foi de me lembrar de datas importantes, por exemplo, Quanto falta para o meu aniversário de casamento? Quanto falta para o aniversário da minha esposa? E do meu filho? Outras também gostaria de saber, quanto falta para o Natal por exemplo. Mas também posso usá-lo para pagar as contas mensais. Então a ideia deste aplicativo é inserir uma descrição e sua pseudo data, com DD ou DD/MM e com base na data atual ser informado quantos dias faltam para chegar aquela pseudo data.
Camada de Visão
Vamos começar trabalhando com as Strings que iremos utilizar, então modifique o arquivo Strings.xml contido na pasta res/values:<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Faltam</string> <string name="action_settings">Faltam</string> <string name="lbDescricao">Descrição do evento:</string> <string name="htDescricao">Informe um descritivo do evento</string> <string name="lbDia">Dia ou Dia/Mês:</string> <string name="htDia">Informe DD ou DDMM</string> <string name="btGuardar">Guardar</string> <string name="btEliminar">Eliminar</string> </resources>Próximo passo é acertarmos o layout principal, para isso altere o arquivo content_main.xml contido na pasta res/layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/lbDescricao" /> <EditText android:id="@+id/descricao" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/htDescricao" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/lbDia" /> <EditText android:id="@+id/dia" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" android:hint="@string/htDia" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/guardar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btGuardar" /> <Button android:id="@+id/eliminar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btEliminar" /> </LinearLayout> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>Na primeira parte teremos dois campos para a entrada dos dados (descrição e dia), os botões separam esta primeira parte da listagem contendo os eventos já cadastrados.
Classe de Registro
Sempre que trabalhamos com listas é ideal criar uma classe que representa um registro desta, e isso facilitará nosso trabalho posterior de armazenar este registro. No pacote projeto.livro.faltam crie uma nova classe chamada Registro com a seguinte codificação:public class Registro implements Serializable { private static final long serialVersionUID = 1L; private final String descricao; private final String dia; public Registro(final String descricao, final String dia) { this.descricao = descricao; this.dia = dia; } @Override public String toString() { return descricao + " | " + dia; } }Esta classe implementa a interface Serializable pois seus objetos serão armazenados. Nesta temos dois campos descrição e dia do tipo String. Para evitar a criação de métodos set/get usamos o construtor da classe e modificamos o método toString (que em breve receberá novos códigos).
Atividade Principal
Na classe MainActivity.java deixe-a com a seguinte codificação:public class MainActivity extends ListActivity { private EditText edDescricao; private EditText edDia; private Listlista = null; private void carregarDados() { lista = new ArrayList ();
Como o layout desta classe possui uma lista, então passa a ser herança de ListActivity. O método carregarDados obtém os dados a partir de um arquivo texto que foi armazenado com os objetos de registro, e são lidos através de um ObjectInputStream, que são adicionados em uma Lista desses objetos, o último passo é criar um ArrayAdapter para carregar essa lista na tela. O método guardarRegistro obtém os dados que foram digitados nos campos EditText e os armazena (como objeto do tipo registro) no arquivo texto.ObjectInputStream ois = null; try { ois = new ObjectInputStream(openFileInput("dias.reg")); Registro reg; do { reg = (Registro)ois.readObject(); lista.add(reg); } while (true); } catch (EOFException e) { } catch (Exception e) { Log.e("Faltam", "Erro Leitura: " + e.getMessage()); } finally { try { ois.close(); } catch (Exception e) { Log.e("Faltam", "Erro ao Fechar Arquivo: " + e.getMessage()); } } if (lista != null) { ArrayAdapter adaptador = new ArrayAdapter (this, android.R.layout.simple_expandable_list_item_1, lista); setListAdapter(adaptador); } } private void guardarRegistro() { Registro reg = new Registro( edDescricao.getText().toString(), edDia.getText().toString()); ObjectOutputStream oos = null; try { oos = new ObjectOutputStream( openFileOutput("dias.reg", Context.MODE_PRIVATE)); for (Registro regs : lista) { oos.writeObject(regs); oos.flush(); } oos.writeObject(reg); oos.flush(); } catch (Exception e) { Log.e("Faltam", "Erro Gravação: " + e.getMessage()); } finally { try { oos.close(); } catch (IOException e) { Log.e("Faltam", "Erro ao Fechar Arquivo: " + e.getMessage()); } } edDescricao.setText(""); edDia.setText(""); edDescricao.requestFocus(); carregarDados(); } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edDescricao = (EditText)findViewById(R.id.descricao); edDia = (EditText)findViewById(R.id.dia); findViewById(R.id.guardar).setOnClickListener( new View.OnClickListener() { @Override public void onClick(final View v) { guardarRegistro(); } }); carregarDados(); } }
Existem alguns problemas quanto a leitura e a armazenagem de objetos. Quanto a leitura é impossível saber quando terminou, portanto repare que o laço de leitura só termina quando acontece um EOFException. Já na gravação o certo seria usar um tipo Context.MODE_APPEND no método openFileInput só que isso simplesmente não funciona, resultado, toda vez devemos gravar os dados antigos e o novo registro.
No método onCreate amarramos nossos EditText de tela com dois objetos da classe, armamos o evento onClick para o botão guardar um novo registro e carregamos os dados já armazenados.
E a primeira parte do nosso projeto está pronta o que resultará na seguinte tela:
Ainda está meio esquisito a listagem que não mostra os dias faltantes para o evento e também não é possível eliminar qualquer registro. Em breve, veremos como realizar essas atividades.
Obrigado e até a próxima
Fernando Anselmo
0 comentários:
Postar um comentário