• Nenhum resultado encontrado

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