quinta-feira, 16 de abril de 2015

Entendendo o framework do Android - Parte 2

Continuando a parte 1 do post sobre o framework do Android, ocasião em que falamos de forma praticamente exclusiva sobre o arquivo AndroidManifest.xml, vamos agora navegar pelas pastas que compõe a estrutura de um projeto:



SRC

A pasta "src" (source) armazena o código-fonte das classes do projeto. Geralmente são arquivos terminados em ".java".  Para cada descrição visual de tela criada na pasta res/layout (que veremos mais à frente), existirá uma classe associada à esta tela. Neste caso, dizemos que a classe é uma "Activity". Entenda o termo "Activity" como "tela". Só que existe uma parte da funcionalidade da tela (classe) e outra parte do design da tela (xml).

Em nosso projeto "meuPrimeiroApp", foram criados automaticamente os dois arquivos: MainActivity.java (classe) e activity_main.xml (descrição do visual da tela). Se abrirmos esses arquivos, veremos que são bem diferentes. O primeiro possui o código-fonte de um programa, escrito em Java, com alguns métodos específicos, como por exemplo o "OnCreate", que é acionado no momento em que a tela é mostrada no celular. Em nosso post anterior, fizemos um teste de envio de SMS, colocando código justamente no método OnCreate, para que executasse no momento em que a tela fosse mostrada no celular. O segundo arquivo não tem funcionalidade. É meramente um arquivo que contém o design da tela, um arquivo-texto no formato xml que diz ao framework exatamente o que aparecerá na tela, em que posição, qual o tipo, cor e tamanho da fonte utilizada, como será o alinhamento, etc.

Este arquivo activity_main.xml é associado à sua classe MainActivity no método OnCreate, com o comando "setContentView(R.layout.activity_main);", que faz  nada mais do que dizer que o conteúdo de visualização da classe vem de "resources/layout/activity_main.xml".

LIBS

A pasta "libs" é onde devemos colocar bibliotecas externas que desejemos acrescentar ao projeto. É onde incluiremos quaisquer arquivos ".jar" que porventura queiramos utilizar no aplicativo. À título de exemplo: Teremos mais à frente um tutorial sobre como consumir webServices SOAP no Android. Mas como SOAP não é um padrão nativo do Android, será necessário utilizarmos uma biblioteca externa (KSOAP), cujo arquivo ".jar" colocaremos na pasta "libs".

RES

A pasta "res" (resources) armazena o que se denomina "recursos" do aplicativo: Imagens, textos parametrizados,  descrição de menus e seus itens, estilos (à la CSS), e os arquivos de descrição do design das telas. Há várias sub-pastas dentro da resources, veremos a utilidade de cada uma delas. O importante é entender que aqui residirá todo o material que iremos utilizar no aplicativo, os insumos.

DRAWABLE

As pastas "drawable" contém especificamente as imagens utilizadas no aplicativo. A tradução de drawable seria algo como "desenháveis" ou "estampáveis". Perceba que há várias pastas drawable: ldpi, mdpi, hdpi, xdpi e xxdpi. Cada uma delas se refere a uma proporção em DPI. Importante salientar que não estamos falando de resolução de imagem em pixels, mas sim de proporção de imagem, em DPI. É um conceito diferente. Ter essas diversas pastas drawable foi a maneira que a Google criou para que um app funcione em qualquer tamanho de tela. Basicamente, para cada imagem que colocarmos na pasta "drawable" (que é a pasta padrão, onde o app buscará as imagens por default), deveremos criar uma versão nas diversas outras proporções, utilizando o mesmo nome de arquivo, mas colocando nas pastas correspondentes. Exemplificando: Se tivermos uma imagem na pasta drawable chamada splash.png, deveremos ter na pasta drawable-ldpi uma versão em baixa resolução com o mesmo nome de arquivo splash.png. Dessa forma, o Android do usuário escolherá automaticamente a versão correta, de acordo com o tamanho da tela onde o app está executando. Sim, a parte de design no Android dá muito trabalho, mas o resultado final é muito bom, permitindo que um app fique perfeito tanto numa tela de três polegadas quanto num tablet de dez.

LAYOUT

A pasta "layout" é onde residem os arquivos xml que descrevem a aparência das telas do aplicativo. Se tivermos uma tela de apresentação (splash screen), ou uma tela de autenticação ou ainda uma tela principal com mapa, por exemplo, todas elas terão um arquivo de descrição xml gravado neste diretório.

MENU

A pasta "menu" é onde definiremos os arquivos xml que compõe o menu de opções que surge ao pressionar a tecla de menu física do Android.

VALUES

Esta pasta "values" é análoga à "drawable". Também é uma das mais importantes. Há um conjunto de pastas do tipo values. Basicamente contém os "valores" dos parâmetros utilizados no aplicativo. No Android, tudo é obrigatoriamente parametrizado. Se você colocar strings hard-coded, isto é, colocar no arquivo xml que descreve uma tela o valor de um texto propriamente dito, o framework reclama com um aviso (warning). O padrão é fazer uma referência à um parâmetro dentro de um arquivo residente na pasta values. A razão é simples: Permitir que o aplicativo seja traduzido e assim possa ser visualizado em dispositivos configurados em diferentes idiomas. Além disso, pela mesma lógica, pode-se definir o tamanho das fontes utilizadas nas telas de acordo com o tamanho da tela, o que garante que o app terá exatamente a mesma aparência seja qual for o tamanho da tela do usuário.  Geralmente, na pasta values, temos o arquivo "strings.xml", onde temos definidas todas as frases que aparecem na tela de nosso app, também temos o arquivo "dimens.xml", onde definimos, para cada tamanho de tela os tamanhos das fontes correspondentes, e também o arquivo "styles.xml", que seria análogo ao CSS do HTML, ou seja, um arquivo onde definimos estilos.

Da mesma forma que ocorre nas "drawable", teremos esses arquivos com o nome de arquivo repetido em cada uma das pastas, mas com uma versão particular. Por exemplo: Se tivermos um arquivo "strings.xml" com as definições das frases em português-brasileiro, deveremos gravar esse arquivo na pasta "values-pt-rBR". Se quisermos que o app apareça com os termos em inglês num aparelho configurado na língua inglesa, então na pasta "values-en" deveremos disponibilizar o arquivo "strings.xml" com cada uma das frases parametrizadas traduzida para o inglês. Exemplificaremos com um post mais à frente.


Bem, ficamos por aqui nesta lição. Essas informações não costumam ser encontradas assim de forma tão didática. Geralmente aprende-se ao longo do processo em que se trabalha no desenvolvimento de aplicativos. Mas acredito ser muito importante já iniciar essa jornada de posse dessas informações. Faz toda a diferença.

Espero que tenham gostado. Um abraço!

4 comentários:

  1. Muito didático este post que cobre diversas pastas e informações da arvore Google Android. Vou tentar criar as pasta values-pt-BR

    ResponderExcluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. criando pasta values-en e value-pt com arquivos strings.xml e textos na respectivas linguas.

    ResponderExcluir
  4. Informação adicional ao post: as duas letras acrescentadas ao nome da pasta "values" após o hífen são códigos de idioma definidos no padrão ISO 639-1. E, opcionalmente, pode-se acrescentar ainda mais um hífen e a letra "r" (minúscula) representando uma região, seguida pelo código da região no padrão ISO 3166-1-alpha-2. Assim, para português brasileiro, o nome da pasta ficaria values-pt-rBR. Os códigos podem ser obtidos nestes links: http://www.loc.gov/standards/iso639-2/php/code_list.php e http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html

    ResponderExcluir