Aplicativo Twitter ® Searches
Passo 5: Criando a terceira linha do componente GridLayout
4.5 Construção da classe MainActivity
As Figuras 4.17 a 4.27 implementam a lógica do aplicativo Twitter Searches na classe
MainActivity, a qual estende ListActivity. O código padrão da classe MainActivity incluiu um método onCreateOptionsMenu, o qual removemos porque não é usado neste aplicativo – vamos discutir onCreateOptionsMenu no Capítulo 5. Por toda esta seção, supomos que você criará os recursos de String necessários à medida que os encontrar nas descrições de código.
4.5.1 As instruções
packagee
importA Figura 4.17 mostra as instruções package e import do aplicativo. A instrução package (inserida na linha 4 pelo IDE quando você criou o projeto) indica que a classe nesse arquivo faz parte do pacote com.deitel.twittersearches. As linhas 6 a 26 importam as classes e interfaces utilizadas pelo aplicativo.
6 import java.util.ArrayList;
1 // MainActivity.java
2 // Gerencia suas pesquisas favoritas no Twitter para
3 // facilitar o acesso e exibir no navegador Web do dispositivo
4 package com.deitel.twittersearches;
5
24 import android.widget.EditText;
25 import android.widget.ImageButton;
26 import android.widget.TextView;
27
Figura 4.17 Instruções package e import de MainActivity.
As linhas 6 e 7 importam as classes ArrayList e Collections do pacote java.util. Usamos a classe ArrayList para manter a lista de identificadores das pesquisas salvas e a classe Collections para ordená-los a fim de que apareçam em ordem alfabética. Das instruções import restantes, consideramos somente as dos recursos apresentados neste capítulo.
• A classe AlertDialog do pacote android.app (linha 9) é usada para exibir caixas de diálogo.
• A classe ListActivity do pacote android.app (linha 10) é a superclasse de MainAc- tivity, a qual fornece o componente ListView do aplicativo e os métodos para manipulá-lo.
• A classe Context do pacote android.content (linha 11) dá acesso às informações
sobre o ambiente no qual o aplicativo está sendo executado e permite usar vários serviços do Android. Vamos utilizar uma constante dessa classe quando ocultar- mos o teclado virtual via programação, depois que o usuário salvar uma pesquisa. • A classe DialogInterface do pacote android.content (linha 12) contém a interface
aninhada OnClickListener. Implementamos essa interface para tratar os eventos que
ocorrem quando o usuário toca em um botão em um componente AlertDialog. • A classe Intent do pacote android.content (linha 13) é usada para criar um ob-
jeto que especifica uma ação a ser executada e os dados utilizados nessa ação – o Android utiliza objetos Intent para ativar as atividades apropriadas. Vamos usar essa classe para ativar o navegador Web do dispositivo, para exibir os resultados da busca no Twitter e para exibir um selecionador de intenção a fim de que o usuário possa escolher como vai compartilhar uma pesquisa.
• A classe SharedPreferences do pacote android.content (linha 14) é usada para ma- nipular pares chave-valor persistentes que são armazenados em arquivos associados ao aplicativo.
• A classe Uri do pacote android.net (linha 15) permite converter uma URL para o
• A classe View do pacote android.view (linha 17) é utilizada em vários métodos de
tratamento de eventos para representar o componente da interface gráfica com que o usuário interagiu para iniciar um evento.
• A classe View contém o componente OnClickListener aninhado da interface (linha
18). Implementamos essa interface para tratar o evento disparado quando o usuá- rio toca no componente ImageButton para salvar uma pesquisa.
• A classe InputMethodManager do pacote android.view.inputmethod (linha 19) per-
mite ocultar o teclado virtual quando o usuário salva uma pesquisa.
• O pacote android.widget (linhas 20 a 26) contém os componentes da interface gráfica do usuário e layouts utilizados nas interfaces gráficas do Android. A classe
AdapterView (linha 20) é a classe base de ListView e é utilizada ao configurar o adaptador de ListView (o qual fornece os itens de ListView). A interface Adap- terView.OnItemClickListener (linha 21) é implementada para responder quando
o usuário toca em um item em um componente ListView. A interface Adapter- View.OnItemLongClickListener (linha 22) é implementada para responder quando
o usuário faz um pressionamento longo em um item em um componente ListView. A classe ArrayAdapter (linha 23) é usada para vincular itens a um componente Lis- tView. A classe ImageButton (linha 25) representa um botão que exibe uma imagem.
4.5.2 Extensão de
ListActivityMainActivity (Figs. 4.18 a 4.27) é a única classe Activity do aplicativo Twitter Searches.
Quando você criou o projeto TwitterSearches, o IDE gerou MainActivity como uma sub- classe de Activity e forneceu a “casca” de um método sobrescrito onCreate, o qual toda sub- classe de Activitydeve sobrescrever. Mudamos a superclasse para ListActivity (Fig. 4.18, linha 28). Quando essa alteração é feita, o IDE não reconhece a classe ListActivity, de modo que é preciso atualizar suas instruções import. No IDE, você pode usar Source > Or- ganize Imports para isso. O Eclipse sublinha todo nome de classe ou interface que não reco-
nhece. Nesse caso, se você deixar o mouse uns instantes sobre o nome da classe ou interface, aparecerá uma lista de correções rápidas. Se o IDE reconhecer o nome, irá sugerir a instrução import ausente que precisa ser adicionada – basta clicar no nome para adicioná-la.
28 public class MainActivity extends ListActivity
29 {
Figura 4.18 A classe MainActivity é uma subclasse de ListActivity.
4.5.3 Campos da classe
MainActivityA Figura 4.19 contém as variáveis estáticas e de instância da classe MainActivity. A cons- tante StringSEARCHES (linha 31) representa o nome do arquivo que vai armazenar as pes- quisas no dispositivo. As linhas 33 e 34 declaram os componentes EditText que vamos usar para acessar as consultas e identificadores digitados pelo usuário. A linha 35 declara a variável de instância savedSearches de SharedPreferences, a qual será usada para ma- nipular os pares chave-valor que representam as pesquisas salvas do usuário. A linha 36 declara o elemento ArrayList<String> que vai armazenar os nomes de identificador or- denados das pesquisas do usuário. A linha 37 declara o elemento ArrayAdapter<String> que utiliza o conteúdo de ArrayList<String> como origem dos itens exibidos no com- ponente ListView de MainActivity.
Figura 4.19 Campos da classe MainActivity.
4.5.4 Sobrescrevendo o método
onCreatede
ActivityO método onCreate (Fig. 4.20) é chamado pelo sistema: • quando o aplicativo é carregado;
• se o processo do aplicativo tiver sido eliminado pelo sistema operacional enquanto o aplicativo estava em segundo plano e, então, é restaurado;
• sempre que a configuração é modificada, como quando o usuário gira o dispositi- vo ou quando abre ou fecha um teclado físico.
O método inicializa as variáveis de instância de Activity e componentes da interface gráfica do usuário – o mantemos simples para que o aplicativo seja carregado rapida- mente. A linha 43 realiza a chamada exigida para o método onCreate da superclasse. Como no aplicativo anterior, a chamada para setContentView (linha 44) passa a constante R.layout.activity_main para inflar a interface gráfica do usuário de activity_main.xml.
39 // chamado quando MainActivity é criada
40 @Override