25%Off

Compre com desconto

Começou!

Começou!

00

DIAS

00

HORAS

00

MIN

00

SEG

Usando styles nos layouts da sua aplicação Android

Usando styles nos layouts da sua aplicação Android
andre.silva
andre.silva

Compartilhe

Construir layouts no Android não é uma tarefa fácil e exige bastante esforço. Não só pela fragmentação, mas também pela orientação e outros detalhes. Digamos que estamos construindo uma aplicação que terá dois layouts diferentes. Um para quando o dispositivo estiver com a tela em portrait e outro para quando o dispositivo estiver com a tela em landscape. Podemos resolver esse problema usando o Application Resources. Basta criarmos um main.xml na pasta layout e outro main.xml na pasta layout-land. Vamos começar com o portrait:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout\_width="match\_parent" android:layout\_height="match\_parent" android:orientation="vertical" >      <TextView android:layout\_height="0dp" android:layout\_weight="1"         android:gravity="center" android:layout\_width="match\_parent"         android:text="Esse é o texto número um" />      <TextView android:layout\_height="0dp" android:layout\_weight="1"         android:gravity="center" android:layout\_width="match\_parent"         android:text="Esse é o texto número Dois" /> </LinearLayout> 

Já em landscape (dentro de res/layout-land), teremos android:orientation="horizontal" além da diferença de pesos entre largura e altura:

Banner da promoção da black friday, com os dizeres: A Black Friday Alura está chegando. Faça parte da Lista VIP, receba o maior desconto do ano em primeira mão e garanta bônus exclusivos. Quero ser VIP
 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout\_width="match\_parent" android:layout\_height="match\_parent" android:orientation="horizontal" >   <TextView android:layout\_height="match\_parent" android:layout\_weight="1"       android:gravity="center" android:layout\_width="0dp"       android:text="Esse é o texto número um" />   <TextView android:layout\_height="match\_parent" android:layout\_weight="1"       android:gravity="center" android:layout\_width="0dp"       android:text="Esse é o texto número Dois" /> </LinearLayout> 

Os resultados serão:

Se não tivessemos criado um main.xml dentro de res/layout-land, em landscape nossa tela apresentaria as duas mensagens uma em cima da outra, aproveitando mal o espaço nesse caso. Ainda assim, temos alguns problemas técnicos, em especial ter de possuir dois main.xml diferentes, com muito código igual em seus interiores. Se tivermos de mudar o layout, teremos de alterar os dois arquivos.

Poderíamos agrupar o que for comum entre os layout, nos poupando de retrabalhos futuros. Para realizarmos o agrupamento de informações do layout, usamos o resource Style. Vamos criar, dentro da pasta res/values, um arquivo styles.xml. Dentro dele podemos ter os chamados "estilos" de cada tipo de componente, neste caso para o dispositivo em portrait:

 <?xml version="1.0" encoding="utf-8"?> <resources>     <style name="Orientation">          <item name="android:orientation">vertical</item>     </style>     <style name="TextStyle">          <item name="android:layout\_weight">1</item>          <item name="android:gravity">center</item>    </style>    <style name="TextWidth" parent="TextStyle">         <item name="android:layout\_width">match\_parent</item>         <item name="android:layout\_height">@dimen/zero</item>    </style> </resources> 

Aqui definimos o estilo para o LinearLayout, que no caso de portrait será vertical. Para detalhes de apresentação de texto, definimos o peso e o gravity em um estilo chamado TextStyle (esse nome é arbitrário) e o outro, nomeado TextWidth, com o tamanho do campo. Repare no TextWidth que usamos a tag parent. Fazemos isso para poder reaproveitar estilos em outros estilos, e nesse caso quem utilizar TextWidth terá também os atributos declarados em TextStyle.

Para usarmos esses styles que acabamos de definir, basta aplicar a tag style dentro de nosso layout, como por exemplo style=@style/TextWidth. Veja como ficou nosso main.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    style="@style/Orientation"    android:layout\_width="fill\_parent"    android:layout\_height="fill\_parent" >    <TextView style="@style/TextWidth" android:text="@string/textOne" />    <TextView style="@style/TextWidth" android:text="@string/textTwo" /> </LinearLayout> 

Repare que além de colocarmos os styles, nós também colocamos os textos e dimensões em arquivos strings.xml e dimens.xml. Estamos seguindo a convenção definida pelo Android de que dimenões e textos devem estar externalizados em seus respectivos arquivos. A ferramenta lint pode te ajudar bastante a achar o que ainda não foi externalizado na sua aplicação.

Ainda temos dois arquivos main.xml, um está na pasta res/layout e outro na res/layout-land. Vamos apagar toda a pasta layout-land. Teremos apenas o arquivo main.xml na pasta res/layout. Agora vamos criar uma pasta chamada res/values-land. Dentro dessa pasta vamos criar um arquivo styles.xml.

Dentro do arquivo styles.xml vamos alterar os estilos que precisamos mudar, no nosso caso a orientação do linear e o tamanho dos TextVieẁs. Para isso, criamos o arquivo style.xml da pasta res/values-land.

 <?xml version="1.0" encoding="utf-8"?> <resources>    <style name="Orientation">        <item name="android:orientation">horizontal</item>    </style>    <style name="TextWidth" parent="TextStyle">        <item name="android:layout\_width">@dimen/zero</item>        <item name="android:layout\_height">match\_parent</item>    </style> </resources> 

Você deve está se perguntando o porquê de não declararmos TextStyle nesse arquivo. Não precisamos escrever o TextStyle por que ele já foi declarado na pasta values default. Quando ele não encontra o style de TextStyle no res/values-land, ele vai procurar no arquivo style.xml declarado na pasta default, isso é, res/values. Agora sim, temos apenas um arquivo main.xml. Customizações do nosso layout ficam então definidos em arquivos de styles.

O código deste teste está disponível no github. Não deixe de conhecer nosso curso completo de desenvolvimento Android.

Veja outros artigos sobre Inovação & Gestão