quinta-feira, 9 de agosto de 2012

Utilização de Resources

Olá pessoal,

Hoje vou escrever sobre a utilização de Resources, mas antes gostaria de avisar que disponibilizei o código fonte do post anterior neste link.

No post anterior quando desenvolvemos o Conversor de Medidas fizemos um breve uso de Resources, neste post vou explicar um pouco mais sobre a utilização dos mesmos.

Os resources são textos, imagens, constantes, entre outros, que utilizamos dentro do nosso aplicativo. É uma boa prática para separar o nosso código destes elementos, isso faz com que o código fique organizado, fácil de efetuar manutenções e de ser internacionalizado.

Imagine que você tenha um aplicativo que deve ser modificado de acordo com a linguagem do dispositivo que está sendo executado. Em um modelo de programação inadequado, um programador pensaria em colocar um "if" ou "case" no código para verificar a localização e aplicar cores e textos. Isso não é nada interessante por que dificulta a manutenção. Isso pode ser resolvido facilmente com a utilização dos Resources no Android.

Nossa aplicação de hoje será baseada em um aplicativo que se adapta a localização que está. Irá apresentar cores, imagens e textos baseados na localização.

Agora você já sabe criar uma aplicação Android, então crie uma nova aplicação nomeada UtilizandoResources com uma atividade em branco, como fizemos na aplicação anterior. Não vou repetir o passo a passo da criação de uma aplicação novamente, até mesmo para que você possa treinar. Em todo caso o código fonte está disponível no final deste artigo.

Se você leu o post anterior, já sabe que os recursos ficam armazenados na pasta "res" dentro do package do aplicativo. Vamos entrar na pasta layout e definir os layout do nosso aplicativo com o código abaixo:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/background_color"
    android:orientation="vertical" >

    <ImageView
        android:layout_width="@dimen/flag_width"
        android:layout_height="@dimen/flag_height"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/flag"
        android:contentDescription="@string/language_name"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/language_name"
        android:textColor="@color/foreground_color"
 />

</LinearLayout>

Neste ponto vamos entender um pouco do que está acontecendo. Se você reparar alguns valores estão definidos como @ e seguido de um tipo. Neste lugares estamos fazendo referencia aos resources da nossa aplicação. Quando você copiou e colou o código percebeu que apareceram algumas mensagens de erro. Isso acontece por que não definimos estes resources ainda. Dentro da estrutura dos Resources os tipos são divididos em pastas. Olhe para a estrutura de pastas e você verá algumas pastas que iniciam com o nome de "drawable", há uma pasta chamada "layout" que já conhecemos e outra chamada "values". Estas são as que nos interessam. Dentro da "drawable" ficam as imagens que serão exibidas no nosso aplicativo. A pasta layout, possui a definição dos "layouts" de todas as atividades de nosso aplicativo e a pasta "values" armazena valores simples, como cores, dimensões, strings e estilos.

O arquivo colors.xml tem a definição das cores que estamos utilizando no nosso layout, se você não tiver este arquivo, pode criá-lo e colar o código abaixo:


<resources>
    <color name="background_color">#00FF00</color>
    <color name="foreground_color">#FFFFFF</color>
</resources>

O arquivo dimens.xml tem todas as medidas que utlizamos em nosso aplicativo. No nosso caso ele trata a largura e altura da bandeira, uma vez que o texto é redimensionado automaticamente. Apague o código deste arquivo e cole o código abaixo.


<resources>
    <dimen name="flag_height">48dp</dimen>
    <dimen name="flag_width">48dp</dimen>
</resources>

O arquivo strings.xml nós utilizamos no post anterior. Nele nós guardamos o texto que utilizamos no nosso aplicativo. Além disso guardamos também os IDs dentro dele.



<resources>

    <string name="app_name">Utilizando Resources</string>
    <string name="title_activity_main">Utilizando Resources</string>
    <string name="language_name">Português (Brasil)</string>
 
</resources>


O arquivo styles.xml define o estilo do nosso aplicativo.



Vamos remover a pasta menu dos resources pois não iremos utilizá-lo em nosso aplicativo. Ela server para definir o menu do sistema.

Depois da remoção da pasta menu, substitua o código da MainActivity.java pelo código abaixo. Isso fará com que a referencia padrão ao menu também seja removida.

package com.example.utilizandoresources;

import android.os.Bundle;
import android.app.Activity;

public class MainActivity extends Activity {

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

}



Vamos colocar algumas imagens dentro de uma das pastas "drawable", vamos utilizar a pasta "drawable-hdpi".

É importante saber que as pastas têm uma estrutura de nome que o Android utiliza em tempo de execução para definir quais Resources serão utilizados. A primeira parte do nome das pasta identifica o tipo da mesma, o que vem depois do hifen serve para definir características de dispositivo ou localização. Por exemplo "hdpi" significa "High dots por inch", isso na frente do nome da pasta "drawable" indica que uma tela de alta densidade irá utilizar estes recursos. Se não colocarmos nas outras pastas, o Android irá utilizar uma delas. Como o h signfica "high", "l" signifca "low", "m" significa "medium" e "xh" significa "Extra high". Estas nomenclaturas são sempre em letras minusculas.

Execute seu código, você deve ter algo do tipo:


Agora vamos fazer com que este aplicativo seja automaticamente traduzido quando o dispositivo estiver em Inglês. Para isso você irá criar uma nova pasta "values", porém seguida da linguagem "en" (values-en). Você pode copiar a pasta atual, pois só iremos alterar valores.

Dentro desta pasta é necessária a presença de dois arquivos, strings.xml e colors.xml. Que devem estar como abaixo, respectivamente:

<resources>

    <string name="app_name">Using Resources</string>
    <string name="title_activity_main">Using Resources</string>
    <string name="language_name">English (USA)</string>
   
</resources>


<resources>
    <color name="background_color">#FF0000</color>
    <color name="foreground_color">#FFFFFF</color>
</resources>

Altere a configuração de idioma do dispositivo e execute novamente, veja que automaticamente o sistema alterou a linguagem e a cor de fundo, faltando apenas a bandeira.

Com a bandeira, será o mesmo caso, porém vamos duplica a pasta "drawable-hdpi" e colocar o "en" entre o tipo e a densidade (drawable-en-hdpi). Além disso vamos trocar o arquivo flag.png, por uma bandeira dos Estados Unidos. O resultado agora será este:



Se você trocar a localização para outro país, o sistema voltará ao português pois este é o padrão dele. 

Esta foi uma utilização simples dos Resources, mais para frente veremos também como utilizá-los via código através da classe R. 







Nenhum comentário:

Postar um comentário