Linear, Table e Relative Layouts com Android Studio

Conheceremos nesse artigo os três principais tipos de layout do ambiente Android.

O que seriam das aplicações Android se não existissem os layouts? A resposta é bem simples: as aplicações não teriam nenhuma interface de comunicação com o usuário, perdendo o que se propõem a fazer, que nada mais é do que facilitar a vida das pessoas que utilizam aplicativos em seus dispositivos móveis.

Ao desenvolver um aplicativo para Android, o layout é uma das principais preocupações que o desenvolvedor deve ter, pois ele será o cartão de visita de seu aplicativo, dando a primeira impressão de como ele é.

Existem duas formas de se programar um layout no Android: via XML ou via código Java. É muito recomendado que se faça o layout em XML e o referencie dentro de sua aplicação, pois o Android Studio já fornece ferramentas visuais para a construção de layouts que geram os códigos XML, mas mesmo assim é interessante que se saiba como o XML funciona.

Para iniciar, na Figura 1 vemos o editor de layouts do Android Studio e alguns componentes que podem ser utilizados no menu do lado esquerdo. Com base neles é que vamos trabalhar.

Figura 1. Editor de Layout do Android Studio

Para usar os componentes que vimos basta apenas clicar sobre o desejado e arrastá-lo para a tela. Assim, o código XML é automaticamente gerado, como mostra a Listagem 1.

<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Hello World" android:id="@+id/textView2" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
Listagem 1. Código XML de layout simples

O código apresentado define um Relative Layout (tipo de layout utilizado para posicionar os elementos em relação a outro, e que veremos mais a frente) e dentro dele é definido o componente de tela TextView, que mostrará a mensagem Hello World. Notem que as propriedades mais importantes que devem ser utilizadas quando um layout é definido são android:layout_width e android:layout_height porque elas definirão a altura e a largura do layout em questão de três formas:

Nas próximas seções vamos estudar os tipos de layout que estão no menu da Figura 1.

Relative Layout

O Relative Layout é o tipo de layout utilizado no Android para se posicionar os elementos em relação a outro. Por exemplo, se temos um Text View e o desenvolvedor posicionar o botão a sua esquerda, no XML pode-se fazer referência a esse para que o elemento de tela seja posicionado em um determinado lugar de acordo com sua posição.

A Figura 2 mostra o Relative Layout em ação, com os elementos de tela devidamente alinhados.

Figura 2. Relative Layout

Notem quem o Primeiro Text View está no topo e o segundo logo abaixo dele: isso é feito utilizando a notação XML android:layout_below, que significa para posicionar o elemento abaixo de outro que já está definido na tela, que nesse caso, é o primeiro Text View da tela. Já o terceiro Text View está posicionado ao lado direito do segundo Text View: a notação para completar isso é a android:layout_toRightOfe juntamente com o ID do elemento que se deseja alinhar. A Listagem 2 mostra o código completo da tela demonstrada na Figura 2.

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Ola Primeiro" android:id="@+id/textView4" android:layout_marginTop="41dp" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Ola Segundo" android:id="@+id/textView5" android:layout_below="@+id/textView4" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="74dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Ola Terceiro" android:id="@+id/textView6" android:layout_alignTop="@+id/textView5" android:layout_toRightOf="@+id/textView5" android:layout_toEndOf="@+id/textView5" android:layout_marginLeft="138dp" android:layout_marginStart="138dp" /> </RelativeLayout>
Listagem 2. Código do Relative Layout da Figura 2

O código mostra claramente os componentes e como eles são alinhados. Destaca-se o exemplo do segundo TextView, onde a notação android:layout_below está claramente dizendo que ele ficará abaixo do componente referenciado, que é o textView4.

Pode-se observar em outros elementos de tela o mesmo comportamento, mas com funcionalidades diferentes, como o android:layout_alignTop, que faz o componente alinhar-se seguindo o topo do referenciado.

Linear Layout

O linear layout é um dos tipos de layouts mais utilizados no desenvolvimento com Android, pois possibilita organizar seus componentes de duas formas: alinhados horizontalmente ou alinhados verticalmente.

Para decidir qual será a orientação do seu Linear Layout deve-se trabalhar com a notação android:orientation. Utilizando o Android Studio pode-se criar esse layout clicando com o botão direito na pasta layout e depois new. Quando abrir o Drop down, clique em Layout Resource File e preencha conforme mostra a Figura 3.

Figura 3. Criando Linear Layout

Repare que o layout é criado vazio, portanto o desenvolvedor deve colocar os componentes. A Figura 4 mostra uma tela criada com dois componentes TextView para demonstrar como eles serão alinhados.

Figura 4. Linear Layout

Notem que o layout está alinhando os componentes verticalmente, graças a tag android:orientation, que recebe como valor “vertical”. A Listagem 3 mostra o código da tela apresentada.

<?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_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Ola DevMedia" android:id="@+id/textView" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Tudo bem?" android:id="@+id/textView3" /> </LinearLayout>
Listagem 3. Código XML linear layout vertical

Agora, para termos o layout da Figura 5, onde os componentes foram alinhados horizontalmente, basta usarmos o código da Listagem 4.

Figura 5. Linear Layout Orientado Horizontalmente
<?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"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Ola DevMedia" android:id="@+id/textView" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Tudo bem?" android:id="@+id/textView3" /> </LinearLayout>
Listagem 4. Código Linear Layout alinhado horizontalmente

Reparou que a tag de orientação sumiu? Por padrão do Linear Layout, o Android, quando não encontra a tag de orientação, assume que a orientação será horizontal.

Table Layout

O Table Layout é uma especialização do Linear Layout e é muito utilizado para criar formulários e telas de login. Para criá-lo deve-se seguir os mesmos passos da Listagem 4, mas o root element deve ser mudado para TableLayout, assim, ao criar sua tela estará vazia, como mostra o código da Listagem 5.

<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> </TableLayout>
Listagem 5. Código básico Table Layout

Na Figura 6 vemos um exemplo de linhas e colunas criadas utilizando o Table Layout. Seu código é apresentado na Listagem 6.

Figura 6. Table Layout
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:shrinkColumns="*" android:stretchColumns="*" android:background="#ffffff"> <!-- Linha 1 com uma coluna--> <TableRow android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center_horizontal"> <TextView android:id="@+id/TextView00" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20dp" android:text="Linha 1" android:layout_span="3" android:padding="18dip" android:background="#FF0000" android:textColor="#000"/> </TableRow> <!-- Linha 2 com 2 colunas --> <TableRow android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center_horizontal"> <TextView android:id="@+id/TextView01" android:text="Linha 2 Coluna 1" android:layout_weight="1" android:background="#00AF00" android:textColor="#000000" android:padding="18dip" android:gravity="center"/> <TextView android:id="@+id/TextView02" android:text="Linha 2 Coluna 2" android:layout_weight="1" android:background="#00FF00" android:textColor="#000000" android:padding="18dip" android:gravity="center"/> </TableRow> <!-- Linha 2 com 3 colunas --> <TableRow android:id="@+id/tableRow1" android:layout_height="wrap_content" android:layout_width="match_parent"> <TextView android:id="@+id/TextView03" android:text="Linha 3 Coluna 1" android:layout_weight="1" android:background="#0000FF" android:textColor="#000000" android:padding="20dip" android:gravity="center"/> <TextView android:id="@+id/TextView04" android:text="Linha 3 Coluna 2" android:layout_weight="1" android:background="#0000CF" android:textColor="#000000" android:padding="20dip" android:gravity="center"/> <TextView android:id="@+id/TextView05" android:text="Linha 3 Coluna 3" android:layout_weight="1" android:background="#0000AF" android:textColor="#000000" android:padding="20dip" android:gravity="center"/> </TableRow> </TableLayout>
Listagem 6. Código XML do Table Layout

Notem que o código apresentado é muito parecido com as definições de tabelas do HTML. Primeiro, o TableLayout é definido como um componente interno. A seguir definimos um TableRow e dentro deste os elementos de tela desejados são colocados alinhados horizontalmente dentro da linha declarada. Lembre-se que todos os elementos de tela devem estar definidos dentro de um TableRow se quiser que eles estejam alinhados na interface gráfica, já que tudo o que estiver dento dele fará parte de uma mesma linha.

Combinação de Layouts

Outra prática interessante que pode ser feita é a combinação entre layouts, onde em uma parte da tela você precise de um tipo de alinhamento e em outra parte um outro tipo. O que pode ser feito, por exemplo, é colocar um Linear Layout dentro de um Relative Layout. A Figura 7 mostra um exemplo bem básico dessa combinação de layouts.

Figura 7. Combinação entre Linear Layout e Relative Layout

Notem que a tela está diferenciada e foi alinhada de acordo com seus respectivos layouts. A Listagem 7 mostra o código XML que deu origem a essa tela.

<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="98dp" android:id="@+id/linearLayout"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Linear1" android:id="@+id/textView" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Linear2" android:id="@+id/textView3" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Linear3" android:id="@+id/textView2" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Linear4" android:id="@+id/textView5" /> </LinearLayout> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Botao Relative" android:id="@+id/button" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Relative" android:id="@+id/textView4" android:layout_alignBottom="@+id/button" android:layout_toRightOf="@+id/button" android:layout_toEndOf="@+id/button" android:layout_marginLeft="58dp" android:layout_marginStart="58dp" /> </RelativeLayout>
Listagem 7. Código XML de combinação de layouts

O desenvolvedor pode se perguntar: se existem dois tipos de layouts com suas peculiaridades, como o Android sabe o que é de quem? A resposta é bem simples: os elementos específicos têm que estar contidos dentro das tags relativas ao seu layout, ou seja, se está contido dentro de é um componente linear aceito, e o mesmo deve acontecer com os demais layouts utilizados.

Ao fazer essa combinação entre dois tipos de layouts deve-se tomar muito cuidado, pois é um processo muito custoso quando se vai renderizar essa tela no dispositivo. O método onCreate do Java, ao fazer a invocação do método setContentView(R.layout.<referencia_nosso_layout>), vai inflar o layout criado, ou seja, ele irá localizar a referência passada e pegar o layout em questão e recursivamente irá converter o XML para o objeto Java. Após essa conversão ele está apto a mostrar na tela o layout desenvolvido.

Para saber mais sobre como criar o layout diretamente no Java, acompanhe a seção a seguir.

Criando Layout em Java

No Android, os layouts podem também ser criados em Java dentro da Activity, mas esse não é um processo muito recomendado, pois o desenvolvedor pode perder muito tempo criando um layout via código, enquanto já existem ferramentas que fazer isso sem o menor esforço, como vimos nos exemplos anteriores.

Vamos usar o exemplo da Figura 4 e a Listagem 3, que foi escrita em XML, agora é escrita em Java, como mostra a Listagem 8.

package br.com.devmedia.appdevmedia; import android.app.Activity; import android.os.Bundle; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.setLayoutParams(new LinearLayout .LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); TextView titleView = new TextView(this); LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); titleView.setLayoutParams(lparams); titleView.setText("Ola DevMedia"); layout.addView(titleView); TextView titleView2 = new TextView(this); LinearLayout.LayoutParams lparams2 = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); titleView2.setLayoutParams(lparams2); titleView2.setText("Tudo bem?"); layout.addView(titleView2); setContentView(layout); } }
Listagem 8. Linear layout em Java

As Listagens 3 e 8 têm a mesma função, mas a codificação em Java permite que o layout seja definido dentro da própria Activity.

Observe que é um código simples, mas muito trabalhoso para se desenvolver, mas imagine em uma aplicação onde se trabalha com muitas Activities: o código ficaria praticamente ilegível e, além do mais, sempre que quiséssemos ver como está a tela, teria que recompilar e exibir no emulador, enquanto o Android Studio já fornece um renderizador de XML para poder mostrar em tempo real como está o layout que o programador está desenvolvendo.

Com isso, concluímos que é muito mais fácil trabalhar com o XML do que o Java. Deixe que a conversão do XML seja feita automaticamente, afinal de contas, é uma das principais vantagens de se trabalhar com o Android Studio.

E não perca tempo usando um layout para definir outro. Cada um tem suas propriedades e não adianta reescrever o código, pois é perda de tempo.

E como vimos, cuidado com a combinação de layouts, pois é muito fácil, mas precisamos de atenção para não referenciar um elemento dentro do layout errado.

Artigos relacionados