Explorando o ciclo de vida da Activity Trabalhando com resources
Explorando o arquivo AndroidManifest.xml
Com o nosso tour introdutório aos principais componentes da plataforma Android e ao ambiente de desenvolvimento completo, é hora de examinar mais de perto os conceitos fundamentais do Android sobre activities, views e resources. As activities fornecem as telas do seu aplicativo e tem papel chave no ciclo de vida do aplicativo Android. A estrutura do Android gerencia o período de vida das telas visíveis, e você aprenderá como responder aos vários pontos do ciclo de vida que encontrar.
A parte visível de uma Activity é composta de subcomponentes chamados views. Views são o que seus usuários veem e aquilo com que eles interagem. Views lidam com o Layout, fornecem elementos de texto para títulos e feedback, forne- cem botões e formas para entradas do usuário e desenham imagens na tela do dis- positivo. Você também pode associar views com monitores de eventos de interface, como controles de tela sensível ao toque. Um conjunto hierárquico de views é usado para compor uma Activity.
Views usam strings, cores, estilos e recursos gráficos, que o Android compila em forma binária e disponibiliza para os aplicativos como resources. A classe gerada automaticamente R.java, que introduzimos no Capítulo 1, fornece uma referência a resources individuais e é a ponte entre as referências binárias e o código fonte de um aplicativo Android. Você usa a classe R, por exemplo, para pegar uma string ou cor e adicioná-la a uma view. A relação entre activities, views e resources é mostrada na Figura 3.1.
Além dos componentes que você usa para construir um aplicativo — views, re- sources e activities — o Android inclui o arquivo manifesto que apresentamos no Capítulo 1: AndroidManifest.xml. Esse arquivo XML fornece os pontos de entrada no seu aplicativo e também descreve as permissões que tem e os componentes que inclui. Uma vez que todo aplicativo Android fornece esse arquivo, vamos examiná-lo em mais detalhes neste capítulo e voltar a ele frequentemente mais tarde. O arquivo manifesto é o centro de onde a plataforma começa a gerenciar seu aplicativo.
Se você já tiver feito desenvolvimento envolvendo UIs em qualquer plataforma, os conceitos de activities, views e resources serão familiares. O Android aborda a
IU de uma maneira ligeiramente diferente e este capítulo irá ajudá-lo a tratar as confusões comuns.
Primeiro, vamos apresentar o aplicativo de exemplo que usaremos para esses conceitos, indo além da teoria para o código para construir uma Activity. Você pode fazer download do código-fonte completo desse exemplo no site web do livro. Este capítulo irá incluir as partes que se concentram na interface do usuário, o Capí- tulo 4 adiciona as seções que se integram com outros aplicativos Android e as partes online incluem os componentes restantes, como networking e parsing.
Activity
View (entrada de texto)
View (imagem)
View (entrada de seleção)
View (mapa)
View (rótulo de texto)
View (botão)
Recursos
Manifesto
(definição de aplicativo, atividades, permissões, intents)
Figura 3.1 Diagrama geral da relação de activity,view, resources e manifesto, mostrando que as activi-
Criando a Activity 67
3.1
Criando a Activity
Ao longo deste capítulo e do próximo, você irá construir um aplicativo que permite aos usuários buscarem críticas de restaurantes baseado na localização e tipo de cozi- nha. Esse aplicativo, RestaurantFinder, vai também permitir ao usuário ligar para o restaurante, visitar seu site web ou encontrar o trajeto para o endereço. Escolhemos esse aplicativo como ponto de partida porque é um caso simples e porque envolve muitas partes diferentes da plataforma Android. Construir um aplicativo de exem- plo nos permite cobrir muito terreno com rapidez — com o benefício adicional de fornecer um aplicativo útil no seu telefone Android!
Para criar esse aplicativo, você precisa de três telas básicas para começar:
Uma tela de critérios, onde o usuário insere os parâmetros de busca por críticas de
restaurantes.
Uma tela com a lista de críticas, que mostra páginas de resultados que atendem os cri-
térios especificados.
Uma página de detalhes da crítica, que mostra os detalhes de uma crítica selecionada.
Lembre-se do Capítulo 1 que uma tela é, em linhas gerais, análoga a uma Activ ity, o que significa que você precisará de três classes de Activity, uma para cada tela. Quando completas, as três telas do aplicativo RestaurantFinder vão se parecer com as mostradas na Figura 3.2.
Nosso primeiro passo na exploração de activities e views será construir a tela
ReviewCriteria do RestaurantFinder. A partir daqui, vamos prosseguir para as outras. Ao longo do caminho, vamos destacar diversos aspectos do projeto e imple- mentação da sua IU Android.
3.1.1 Criando uma classe Activity
Para criar uma tela, estenda a classe base android.app.Activity (como você fez no Capítulo 1) e rededfina os métodos chave definidos por ela. A listagem seguinte mostra a primeira parte da classe ReviewCriteria do RestaurantFinder.
lisTagem 3.1 A primeira metade da classe Activity ReviewCriteria
public class ReviewCriteria extends Activity {
private static final int MENU_GET_REVIEWS = Menu.FIRST; private Spinner cuisine;
private Button grabReviews; private EditText location; @Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.review_criteria); location = (EditText) findViewById(R.id.location); cuisine = Spinner findViewById(R.id.cuisine); grabReviews = (Button) findViewById(R.id.cuisine); grabReviews = (Button) findViewById(R.id.get_reviews_button); ArrayAdapter<String> cuisines =
new ArrayAdapter<String>(this, R.layout.spinner_view, getResources(). getStringArray(R.array.cuisines)); cuisines.setDropDownViewResource( R.layout.spinner_view_dropdown); cuisine.setAdapter(cuisines); grabReviews.setOnClickListener( new OnClickListener() {
public void onClick(View v) { handleGetReviews(); }
}); }
A classe ReviewCriteria estende android.app.Activity, que executa uma série de coisas importantes. Ela dá um contexto ao seu aplicativo, porque a própria Ac tivity estende indiretamente a classe android.content.Context; Context for- nece acesso a muitas operações importantes do Android, como você verá mais tarde. Estender Activity faz com que você herde os métodos do ciclo de vida do An- droid, o que dá ao framework um lugar para iniciar e rodar seu aplicativo. Por fim, a Activity fornece um contêiner onde os elementos View podem ser colocados.
q
Redefine onCreate()w
Define o layout com setContentViewe
Descompacta as views do XMLr
Define a instância ArrayAdaptert
Configura a view para dropdownCriando a Activity 69 Uma vez que uma Activity representa uma interação com o usuário, ela precisa fornecer componentes visíveis para a tela. Na classe ReviewCriteria, você referen- cia três views no código: cuisine, grabReviews e location
w
. cuisine é umSpinner, componente especial de lista de seleção única do Android. grabReviews
é um Button. location é um tipo de View chamado EditText, um componente básico de entrada de texto.
Você posiciona elementos como esses dentro de uma Activity usando um layout para definir os elementos de uma tela. Você pode definir o layouts e as views direta- mente no código ou em um arquivo de recursos de layout XML. Você vai aprender mais sobre views e layouts conforme progredirmos nesta seção.
Depois que uma Activity é iniciada, o ciclo de vida do aplicativo Android toma conta e o método onCreate() é invocado
q
. Esse método é um de uma série de importantes métodos de ciclo de vida que a classe Activity fornece. Toda Ac tivity redefine onCreate(), onde os passos de inicialização de componente são invocados.Dentro do método onCreate() você geralmente invocará o método setCon tentView() para exibir o conteúdo de um arquivo de layout XML
w
. Um arquivo de layout XML define objetos View, organizados em uma estrutura hierárquica em árvore. Depois que foram definidas em relação ao layout pai, cada view pode ser descompactado no tempo de execução.3.1.2 XML versus layouts programáticos
O Android fornece APIs que permitem que você gerencia seu layout através de código Java ao invés de XML. Embora essa abordagem possa parecer mais fami- liar e confortável para desenvolvedores de outras plataformas móveis, geralmente você deve evitá-la. Os layouts em XML tendem a ser mais fáceis para ler, entender e manter, e impõem facilmente a separação da IU do seu aplicativo de sua lógica.
Views que precisam de manipulação de tempo de execução, como serem vin- culadas a dados, podem então ser referenciadas no código e enviadas para seus respectivos subtipos
e
. Views estáticas — aquelas que não precisam interagir ou ser atualizadas durante o tempo de execução, como títulos — não precisam ser refe- renciadas no código. Essas views são mostradas automaticamente na tela porque são parte do layout definido no XML. Por exemplo, as capturas de tela da Figura 3.1 mostram duas etiquetas na tela ReviewCriteria e também três entradas que já discutimos. Essas etiquetas não estão presentes no código. Elas são definidas no arquivo review_criteria.xml que está associado com essa Activity. Você verá esse arquivo de layout quando discutirmos recursos definidos por XML.A próxima área de interesse da Activity ReviewCriteria vincula dados às views de lista de seleção, os objetos Spinner. O Android fornece um conceito de adaptador usado para vincular views com uma fonte de dados subjacente. Um adap- tador é um manipulador de coleções que retorna cada item da coleção como uma
View. O Android fornece muitos adaptadores básicos: ListAdapter, ArrayAdapt er, GalleryAdapter, CursorAdapter e outros. Você também pode criar facilmente seu próprio adapter, uma técnica utilizada quando discutirmos a criação de views personalizadas na Seção 3.2. Aqui, estamos usando um ArrayAdapter preenchido com Context (this), um elemento View definido em um arquivo de recursos XML
e um array representando os dados. Note que a fonte de dados do array também é definida como um recurso em XML
r
— sobre o qual você irá aprender na Seção 3.3. Quando criamos o ArrayAdapter, definimos a View para ser usada pelo ele- mento mostrado no Spinner antes que ela seja selecionada pelo usuário. Depois que for selecionada, ela deve fornecer uma interface visual diferente — essa é aview definida no menu suspenso
t
. Depois que definirmos o adaptador e seus elementos view, nós o colocamos no objeto Spinner.A última coisa que essa Activity inicial demonstra é nosso primeiro uso explícito de manipulação de eventos. Elementos de IU suportam muitos tipos de eventos, sobre muitos dos quais você irá aprender na Seção 3.2.7. Nesse exemplo, estamos usando um
OnClickListener com nosso Button para responder a cliques no botão.
Depois que o método onCreate() for concluído e os nossos dados forem vincu- lados às views Spinner, teremos os itens de menu e seus manipuladores de ação as- sociados. A próxima listagem mostra como isso é implementado na última parte de
ReviewCriteria.
lisTagem 3.2 Segunda metade da classe Activity ReviewCriteria
. . . @Override
public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, ReviewCriteria.MENU_GET_REVIEWS, 0, R.string.menu_get_reviews).setIcon( android.R.drawable.ic_menu_more); return true; } @Override
public boolean onMenuItemSelected(int featureId, MenuItem item) { switch (item.getItemId()) {
case MENU_GET_REVIEWS: handleGetReviews(); return true; }
return super.onMenuItemSelected(featureId, item); }
private void handleGetReviews() {
if ((location.getText() == null() || { location.getText().toString().equals("")) { newAlertDialog.Builder(this).setTitle(R.string.alert_label). setMessage(R.string.location_not_supplied_message) setPositiveButton("Continue", new android.content.DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int arg1) { // Just close alert.
} }).show(); return; } RestaurantFinderApplication application = (RestaurantFinderApplication) getApplication(); application.setReviewCriteriaCuisine( cuisine.getSelectedItem().toString()); application.setReviewCriteriaLocation(