Tableless

Busca Menu

A pasta “res” e os resources em um projeto Android

Seja o primeiro a comentar por

É preciso mais do que só código para criarmos um aplicativo realmente bom para Android. E por mais que amemos código, temos que entender como usar todos os recursos que o Android nos dá, por isso, vamos lá!

O primeiro passo é entender que resources o Android nos permite usar na criação de um App.

Tipos de Resources

Como vamos ver daqui a pouco, todos os resources de um projeto ficam na pasta res/ dele. E podem ser basicamente:

Animações

Podem ser dois tipos “interpoladas” (tween animation) e de “frames” (frames animation). A primeira consiste em criar uma animação modificando uma única imagem e a segunda segue a lógica do .gif ao criar uma animação com uma sequência de imagens.

Cores

Você define cores de acordo com o estado da View.

Drawable

Recursos gráficos que podem ser bitmaps ou XML.

Layout

Você pode definir vários layouts para sua UI e alterná-los de acordo com o estado da aplicação.

Menu

Assim como os layouts para sua UI, você pode definir “layouts de menu” para usá-los na sua aplicação (método onCreateOptionsMenu() da sua Activity).

Strings

Um recurso super interessante. Pois te permite definir strings e utilizá-las por todo o seu projeto concentrando-as em apenas um lugar, caso queira modificá-las depois. Permite também a internacionalização do seu App, sendo utiliza-da na tradução da sua aplicação.

Estilo

Define aparência e formato dos elementos da sua UI. (Uso bem parecido com o do CSS: concentrar estilização em um único arquivo.)

Outros tipos de Recurso

Assim como as strings, podemos definir valores booleanos, inteiros, dimensões, cores e outras arrays para usarmos por toda a aplicação.

A pasta “res”

Você deve sempre usar os arquivos e pastas de resource para armazenar valores da sua aplicação, além das imagens, é claro. Dessa forma você consegue manter e atualizar seu código muito mais facilmente, além de poder definir alternativas para cada um deles, de acordo com situações específicas, como diferentes idiomas, tamanhos e orientações de tela. Isso é ótimo, visto a gama imensa de dispositivos que utilizam o sistema do robô verde.

A pasta res/ é a pasta do seu projeto que guarda todos os resources da sua aplicação:

Tree do Android Studio

Cada tipo de recurso que vimos antes deve ficar dentro de uma dessas pastas. Abaixo temos uma tabela retirada da documentação do Android, com os nomes das pastas e os respectivos tipos de resource:

Diretório Tipo de Resource
animator/ arquivos XML que definem animações de propriedades.
anim/ arquivos XML que definem tween animations. (Animações de propriedades podem ser salvas aqui também, mas o diretório animator/ é preferível, por questão de organização)
color/ arquivos XML que definem um estado de lista de cores. Veja Color State List Resource
drawable/ arquivos Bitmap (.png, .jpg, .gif) ou arquivos XML que são compilados nos seguintes resources:

  • arquivos Bitmap
  • 9-Patch (bitmaps redimensionáveis)
  • listas de estado
  • Shapes (formas)
  • Animações (frame animations)
  • Outros tipos

Veja Drawable Resources para mais informações.

mipmap/ Arquivos “drawable” especificamente para ícones de aplicações de diferentes tipos de densidade.
layout/ arquivos XML que definem sua UI (user interface).
menu/ arquivos XML que definem os menus da sua aplicação, como Menu de Opções, de Contexto e Sub-menus. Mais informações em: Menu Resource.
raw/ Pasta para salvar arquivos na sua forma natural (raw).
values/ Arquivos XML que contêm valores, como strings, inteiros, e cores. Dentro dessa pasta você deve nomear cada arquivo XML com o nome do seu resource e dessa forma irá acessar com uma subclasse de R. Por exemplo, o arquivo string.xml será acessado por R.string. Abaixo algumas convenções:

  • arrays.xml para Arrays.
  • colors.xml para valores de cores.
  • dimens.xml para dimensões.
  • strings.xml para todas as strings.
  • styles.xml para estilos.
xml/ Arquivos XML que podem ser lidos em tempo de execução chamando Resources.getXML(). Vários arquivos XML de configuração podem ser salvos aqui, por exemplo.

 Mas e essas outras pastas?

Você deve ter notado que na imagem, temos outras pastas bem parecidas com as que guardam os resources por padrão. São elas: drawable-hdpidrawable-mdpidrawable-xhdpidrawable-xxhdpi (que são variações da pasta drawable), layout-land, layout-sw600dp e layout-sw600dp-land (que são variações da pasta layout) e as variações da pasta values, que são values-en, values-es e values-sw600dp.

resource_devices_diagram2

Dois dispositivos diferentes, cada um utilizando um resource de layout diferente.

 

Como vimos antes, um dos maiores benefícios de usarmos a estrutura de resources do Android é a facilidade de manutenção e a capacidade de alterar os resources de acordo com características e configurações dos dispositivos. É por isso que temos essas variações de nomes de pastas. Por exemplo: a pasta values guarda o arquivo strings.xml, responsável pelas strings da aplicação, como nome e versão do App, título para cada Activity, URLs e qualquer mensagem ou texto que você usar, mas temos também a pasta values-es, que também guarda um arquivo strings.xml (com  as mesmas strings do arquivo anterior), mas que receberá uma prioridade maior, se o idioma do dispositivo for o inglês. Ou seja, o processo de tradução da aplicação se faz apenas colocando valores traduzidos dentro dessa variação da pasta value.

Resumindo: você pode mudar o nome da pasta para utilizar determinados resources em determinadas condições.

Como escolher o nome da pasta dos resources?

Se você está usando o Android Studio, o que eu recomendo fortemente (e ensino a instalar aqui), a forma mais fácil de criar uma pasta de resource é clicar com o botão direito do mouse na pasta res/, na guia 1. Project (imagem anterior) e ir em New > Android resource directory.

Quando você clicar, irá abrir a janela abaixo:

 

New Resource Directory

No primeiro campo, você pode alterar o nome do diretório (você não precisa digitar nada, pois a IDE irá completar o nome de acordo com as opções que você selecionar). Logo abaixo, você pode escolher o tipo de resource.

Após escolher o tipo de resource, você deve selecionar um dos “qualificadores” à esquerda e clicar nas duas setas para a direita, que estão entre os dois quadros. Irá aparecer as opções de cada qualificador. Por exemplo, ao escolher UI Mode, teremos a possibilidade de escolher entre Portrait, Landscape e Square:

New Resource Directory Final

Podemos escolher mais de um qualificador (como na imagem acima) e ao clicar nos itens da coluna da direita (Chosen qualifiers) podemos alterar as opções de cada um. No final, basta clicar em OK.

Você pode encontrar uma lista completa dos qualificadores, caso queira escolher o nome da pasta manualmente ou não esteja usando o Android Studio, na documentação do Android. Lembrando que a ordem dos qualificadores deve ser a mesma da tabela, ou seja, nomear uma pasta como drawable-hdpi-port está errado e drawable-port-hdpi está certo, pois o qualificador de orientação da tela (-port) vem antes do qualificador de densidade de píxel (-hdpi).

Como acessar esses resources?

OK. Já sabemos como organizar nossos arquivos e pastas e como podemos criar um App com a melhor compatibilidade possível. Agora é hora de descobrir como acessar esses arquivos.

Na verdade é bem simples: utilizaremos o ID de cada resource. E todos os IDs dos resources são definidos na sua classe R, que a aapt tool automaticamente gera.

Quando sua aplicação é compilada a aapt tool gera a classe para os resources dentro da pasta res e sub-classes para os tipos de resource. Além disso, para cada resource desse tipo é gerado um inteiro estático. Mas apesar da lasse R conter todos os IDs, você não deve precisar olhar nela para acessar um resource, basta saber que um ID é composto pelo tipo e pelo nome do resource (sem extensão). Sendo assim, você já sabe que o ID do seu arquivo activity_about.xml dentro da pasta layout é: layout.activity_about.

Por fim, existem duas formas de acessar um resource utilizando esse ID:

No código: usando o inteiro estático provido pela classe R, assim: R.layout.activity_about. Por exemplo:


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_about);
    }

Em um arquivo XML: usando uma sintaxe especial (@tipo/nome) usando o ID provido pela classe R, assim: @string/list_item_textview_title_default. Por exemplo:


    <TextView
        android:id="@+id/list_item_textview_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_credits"
        style="@style/h1"/>

Conclusão

A organização das pastas de resources do Android é bem simples e intuitiva e nos permite tornar nossa aplicação compatível com todos os tipos de dispositivos do mercado. Sendo assim, não temos desculpas para desenvolver aplicações cada vez melhores! Abraços e até a próxima!

Publicado no dia