para lidar com alterações na posição do cursor no componente
Passo 15: Centralizando os componentes tipTextView e
99 new OnSeekBarChangeListener()
Figura 3.15 Classe interna anônima que implementa a interface OnSeekBarChangeListener para responder aos
100 {
101 // atualiza customPercent e chama updateCustom
102
103
104
105 {
106 // configura customPercent com a posição do cursor de SeekBar
107 customPercent = / 100.0;
108 updateCustom(); // atualiza os componentes TextView de gorjeta personalizada
109 } // fim do método onProgressChanged
110
111 @Override
112 public void onStartTrackingTouch(SeekBar seekBar)
113 {
114 } // fim do método onStartTrackingTouch
115
116 @Override
117 public void onStopTrackingTouch(SeekBar seekBar)
118 {
119 } // fim do método onStopTrackingTouch
120 }; // fim de OnSeekBarChangeListener
121
@Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
progress
Figura 3.15 Classe interna anônima que implementa a interface OnSeekBarChangeListener para responder aos
eventos do componente customSeekBar.
Sobrescrevendo o método onProgressChanged da interface
OnSeekBarChangeListener
As linhas 102 a 119 implementam os métodos da interface OnSeekBarChangeListener. O método onProgressChanged é chamado sempre que a posição do cursor do compo- nente SeekBarmuda. A linha 107 calcula customPercent usando o parâmetro progress do método – um valor int representando a posição do cursor do componente SeekBar. Dividimos isso por 100,0 para obter a porcentagem personalizada. A linha 108 chama o método updateCustom para recalcular e exibir a gorjeta personalizada e o total.
Sobrescrevendo os métodos onStartTrackingTouch e
onStopTrackingTouch da interface OnSeekBarChangeListener
A linguagem Java exige que cada método de uma interface que você implemente seja sobrescrito. Este aplicativo não precisa saber quando o usuário começa a mover o cursor do controle deslizante (onStartTrackingTouch) ou quando para de movê-lo (onStopTra- ckingTouch); portanto, fornecemos simplesmente um corpo vazio para cada um deles (linhas 111 a 119) para cumprir o contrato da interface.
Classe interna anônima que implementa a interface TextWatcher
As linhas 123 a 156 da Figura 3.16 criam o objeto de classe interna anônima amountE- ditTextWatcher que responde aos eventos de amountEditText. A linha 62 registrou esse objeto para receber os eventos de amountEditText que ocorrem quando o texto muda.
Sobrescrevendo o método onTextChanged da interface TextWatcher
O método onTextChanged (linhas 126 a 144) é chamado quando o texto do componen- te amountEditText é modificado. O método recebe quatro parâmetros. Neste exemplo, usamos apenas CharSequence s, que contém uma cópia do texto de amountEditText. Os outros parâmetros indicam que os count caracteres, a partir de start, substituíram o texto anterior de comprimento before.
139
140 // exibe o valor da conta formatado como moeda corrente
141 amountDisplayTextView.setText(currencyFormat.format(billAmount));
142 updateStandard(); // atualiza os componentes TextView de gorjeta de 15%
143 updateCustom(); // atualiza os componentes TextView de gorjeta personalizada
144 } // fim do método onTextChanged
145
146 @Override
147 public void afterTextChanged(Editable s)
148 {
149 } // fim do método afterTextChanged
150
151 @Override
152 public void beforeTextChanged(CharSequence s, int start, int count,
153 int after)
154 {
155 } // fim do método beforeTextChanged
156 }; // fim de amountEditTextWatcher
157 } // fim da classe MainActivity
Figura 3.16 Classe interna anônima que implementa a interface TextWatcher para responder aos eventos do componente amountEditText.
A linha 133 converte a entrada do usuário de amountEditText em um valor double. Permitimos ao usuário inserir somente números inteiros em centavos; portanto, dividi- mos o valor convertido por 100,0 para obtermos o valor da conta real – por exemplo, se o usuário digitar 2495, o valor da conta será 24.95. As linhas 142 e 143 chamam upda- teStandard e updateCustom para recalcular e exibir as gorjetas e os totais.
Outros métodos do componente TextWatcheramountEditTextWatcher
Este aplicativo não precisa saber que alterações estão para ser feitas no texto (before- TextChanged) ou que o texto já foi alterado (afterTextChanged); portanto, simplesmente sobrescrevemos cada um desses métodos da interface TextWatcher com um corpo vazio (linhas 146 a 155) para cumprir o contrato da interface.
3.6
AndroidManifest.xml
Nesta seção, você vai modificar o arquivo AndroidManifest.xml para especificar que a ativi- dade (Activity) deste aplicativo suporta apenas a orientação retrato de um dispositivo e que o teclado numérico virtual sempre deve permanecer na tela. Você vai usar o editor Android Ma-
nifest do IDE para especificar essas configurações. Para abrir o editor Android Manifest, clique
duas vezes no arquivo AndroidManifest.xml do aplicativo no Package Explorer. Na parte in-
ferior do editor, clique na guia Application (Fig. 3.17) e, então, selecione o nó MainActivity na seção Application Nodes, na parte inferior da janela. Isso exibe configurações para MainAc- tivity na seção Attributes for com.deitel.tipcalculator.MainActivity.
Guia Application Selecione este nó para especificar configurações para MainActivity do aplicativo
Figura 3.17 Guia Application do editor Android Manifest.
Configurando MainActivity para a orientação retrato
Em geral, a maioria dos aplicativos deve suportar as orientações retrato e paisagem. Na orientação retrato, a altura do dispositivo é maior que sua largura Na orientação paisa- gem, a largura é maior que a altura. No aplicativo Tip Calculator, girar o dispositivo para
a orientação paisagem em um telefone típico faria o teclado numérico ocultar a maior parte da interface gráfica do usuário. Por isso, você vai configurar MainActivity para suportar apenas a orientação retrato. Na seção Attributes for com.deitel.tipcalculator.MainAc- tivity do editor Android Manifest, role para baixo até a opção Screen orientation e selecione
aplicativo usando o editor Graphical Layout do IDE Android Developer Tools, a janela Outline e a janela Properties. Percorremos também o código da subclasse MainActivity de Activity, a qual definiu as funcionalidades do aplicativo.
Na interface gráfica do aplicativo, você usou um componente GridLayout para or- ganizar as visualizações em linhas e colunas. Você exibiu texto em componentes TextView e recebeu entrada de um componente EditText e de um componente SeekBar.
A classe MainActivity exigiu muitos recursos de programação orientada a objetos com Java, incluindo classes, objetos, métodos, interfaces, classes internas anônimas e he- rança. Explicamos a ideia de inflar a interface gráfica do usuário a partir de seu arquivo XML em sua representação na tela. Você aprendeu sobre a classe Activity do Android e parte do ciclo de vida de Activity. Em particular, você sobrescreveu o método onCreate para inicializar o aplicativo quando ele é iniciado. No método onCreate, você usou o mé- todo findViewById de Activity para obter referências para cada um dos componentes de visualização com que o aplicativo interage via programação. Definiu uma classe interna anônima para implementar a interface TextWatcher, permitindo ao aplicativo calcular novas gorjetas e totais quando o usuário altera o texto no componente EditText. Você também definiu uma classe interna anônima para implementar a interface OnSeekBar- ChangeListener, permitindo ao aplicativo calcular uma nova gorjeta personalizada e um novo total quando o usuário muda a porcentagem de gorjeta personalizada movendo o cursor do objeto SeekBar.
Por último, abriu o arquivo AndroidManifest.xml no editor Android Manifest do
IDE para especificar que MainActivity devia suportar somente a orientação retrato e que sempre devia exibir o teclado numérico.
O uso do editor Graphical Layout do IDE, da janela Outline, da janela Properties e do
editor Android Manifest permitiu construir este aplicativo sem manipular o código XML
nos arquivos de recurso do projeto e no arquivo AndroidManifest.xml.
No próximo capítulo, apresentamos as coleções enquanto construímos o aplicati- vo Twitter® Searches. Muitos aplicativos móveis exibem listas de itens. Você vai fazer isso
usando um componente ListActivity contendo um elemento ListView vinculado a um elemento ArrayList<String>. Vai também armazenar dados do aplicativo como prefe- rências do usuário e vai aprender a ativar o navegador Web do dispositivo para exibir uma página web.
Objetivos
Neste capítulo, você vai:
䊏 Dar suporte para as orientações retrato e paisagem do dispositivo.
䊏 Ampliar o componente ListActivity para criar uma atividade que exibe uma lista de itens em um componente ListView. 䊏 Permitir que os usuários interajam com um aplicativo por meio
de um componente ImageButton. 䊏 Manipular coleções de dados.
䊏 Usar SharedPreferences para armazenar pares chave-valor de dados associados a um aplicativo.
䊏 Usar um componente SharedPreferences.Editor para modificar pares chave-valor de dados associados a um