Os quatro tipos básicos de layout
O layout é um contêiner usado para agrupar muitos controles. Ele pode ajustar a posição dos elementos internos seguindo uma regra de organização.
Assim conseguimos criar interfaces bonitas.
É possível aninhar layouts dentro de outros layouts.
Layout – LinearLayout (Layout Linear)
Layout linear, muito utilizado
Como o nome sugere, os controles contidos nele são dispostos sequencialmente em uma direção linear.
Com o atributo android:orientation, definimos a direção de disposição: vertical ou horizontal
Sintaxe básica
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</LinearLayout>Code language: HTML, XML (xml)
Vamos ver na prática
Criamos um layout e alteramos a atividade principal para usar esse layout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"
/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2"
/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3"
/>
</LinearLayout>Code language: HTML, XML (xml)

A atividade principal carrega esse layout
setContentView(R.layout.test_linear);
Se alterarmos para disposição horizontal

android:orientation=”horizontal”
Layout – Alinhamento dos filhos no LinearLayout
Definimos o alinhamento dos controles com android:layout_gravity.
Porém, quando o LinearLayout usa orientação horizontal, apenas os alinhamentos na direção vertical têm efeito. Nesse caso, o comprimento horizontal não é fixo.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:text="1"
/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2"
android:layout_gravity="center"
/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3"
android:layout_gravity="bottom"
/>
</LinearLayout>Code language: HTML, XML (xml)
Ou seja, quando o layout está no modo Horizontal, apenas os alinhamentos superior, central e inferior funcionam para os controles
Layout – Proporção de tela no LinearLayout
Se definirmos a largura dos controles filhos como 0dp
Podemos usar
o atributo android:layout_weight=”n” para definir a proporção ocupada pelo controle dentro do layout
Página 108
Além disso, podemos usar o weight em apenas um dos elementos

e deixar outro sem usar esse atributo
Assim, o outro elemento, como o botão no exemplo, mantém a largura original. Essa forma de escrever é muito útil
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button1"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="1" />
<Button
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="wrap_content"
android:text="2" />
<Button
android:id="@+id/button3"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="3" />
</LinearLayout>Code language: HTML, XML (xml)
Botões com largura baseada no conteúdo, e o campo de edição ocupa o espaço restante
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1" />
</LinearLayout>Code language: HTML, XML (xml)
Layout – RelativeLayout (Layout Relativo)
RelativeLayout, também chamado de layout relativo
Ele permite posicionar os controles em qualquer lugar do layout usando posicionamento relativo.
Por isso, o RelativeLayout conta com muitos atributos.
Podemos configurar o controle com os atributos
android:layout_alignParentLeft
android:layout_alignParentTop
android:layout_alignParentRight
android:layout_alignParentBottom
android:layout_centerInParent — esses cinco atributos definem a posição do controle: esquerda, topo, direita, base e centro

<?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">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="2" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="3" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:text="4" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:text="5" />
</RelativeLayout>Code language: HTML, XML (xml)
Definir posição em relação a outro controle
Usando android:layout_above=”@id/button3″
colocamos um controle acima de outro.
Com layout_below, definimos um controle abaixo de outro.
Com layout_toLeftOf, o controle fica à esquerda de outro elemento.
Com layout_toRightOf, o controle fica à direita de outro elemento.
Atenção: quando um controle depende da posição de outro, o controle de referência deve ser declarado antes no XML.
Vamos colocar o button1 no centro, declarando ele no início do XML, e os outros quatro botões serão posicionados com base nele
<?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">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/button1"
android:layout_toLeftOf="@id/button1"
android:text="2" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/button1"
android:layout_toRightOf="@id/button1"
android:text="3" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/button1"
android:layout_toRightOf="@id/button1"
android:text="4" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/button1"
android:layout_toLeftOf="@id/button1"
android:text="5" />
</RelativeLayout>Code language: HTML, XML (xml)

Layout – FrameLayout (Layout de Moldura)
Mais simples que os dois layouts anteriores
Também tem menos casos de uso na prática.
Esse layout não tem regras de posicionamento flexíveis. Por padrão, todos os controles são colocados no canto superior esquerdo.
Vamos testar: adicionamos um TextView e um ImageView
Podemos usar o atributo layout_gravity para definir o alinhamento dentro do layout.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/img1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="foxdevelop.com"
android:layout_gravity="right"
/>
</FrameLayout>Code language: HTML, XML (xml)
Layout extra – Layout de porcentagem
Os três layouts acima existem desde a versão 1.0 do Android.
E continuam sendo usados até hoje.
Mas apenas o LinearLayout aceita o layout_weight para definir o tamanho dos controles. Os outros dois não suportam esse recurso.
Por exemplo, é difícil fazer dois botões ocuparem metade da tela usando RelativeLayout.
Mas a partir do Android 7.0, foi adicionado o layout de porcentagem.
Esse layout é apenas uma extensão do RelativeLayout e do FrameLayout, com o prefixo Percent.
Ele é uma extensão dos dois layouts anteriores.
Precisamos adicionar a dependência do layout de porcentagem no build.gradle.
Abra o arquivo app/build.gradle
Adicione dentro de dependencies
compile ‘com.android.support:percent:27.1.1’
Ao modificar o build.gradle, o gradle faz a sincronização automaticamente e importa a biblioteca de porcentagem para o projeto, não precisamos fazer nada manualmente.
Depois alteramos o layout para
<android.support.percent.PercentFrameLayout
Depois configuramos nos controles filhos
app:layout_widthPercent=”50%”
app:layout_heightPercent=”50%”
Ao mesmo tempo, ainda podemos usar o atributo layout_gravity nos filhos
Controles personalizados e importação de arquivos de layout
Diagrama de herança dos controles e layouts
Todos os controles que usamos herdam direta ou indiretamente da classe View.
Todos os layouts herdam direta ou indiretamente da classe ViewGroup.
View é o componente básico de interface do Android.
Ele desenha uma área retangular na tela e responde aos eventos dessa região.
Importar layouts
Aplicativos de iPhone costumam ter um padrão: botão de voltar no canto esquerdo superior e título no canto superior direito.
Vamos reproduzir esse padrão.
Criar um botão e um TextView já é simples para nós.
Mas se todas as telas tiverem esse mesmo cabeçalho, teremos muito código repetido.
Podemos resolver isso usando a importação de layouts.
Criamos um arquivo justtitle.xml
Vamos criar um novo projeto TestCustom
Depois adicionamos um layout chamado justtitle.xml
Código abaixo
<?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="wrap_content"
android:background="#137e11"
>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:text="Voltar"
android:textColor="#fff"
android:background="@null"
/>
<TextView
android:id="@+id/textview"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center"
android:text="Título"
android:textSize="18sp"
android:textColor="#fff"
android:background="@null"
android:layout_margin="5dp"
/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="..."
android:layout_margin="5dp"
android:background="@null"
/>
</LinearLayout>Code language: HTML, XML (xml)
Depois alteramos a view da atividade principal com o código abaixo
Lembre-se de usar a tag include para importar o nosso justtitle.xml
<?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"
>
<include layout="@layout/justtitle"/>
</LinearLayout>Code language: HTML, XML (xml)
Criamos uma BasicActivity e sobrescrevemos o método onCreate

Depois ocultamos a ActionBar original
package com.foxdevelop.www.testcustom;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
public class BasicActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
if (actionBar!=null)
{
actionBar.hide();
}
}
}Code language: JavaScript (javascript)
Uso de controles de layout personalizados
Para implementar melhor a função de voltar
Não queremos escrever o código de retorno em cada atividade
Para isso, criamos nosso próprio Layout herdando de LinearLayout
Vamos chamá-lo de TitleLayout
No construtor do layout personalizado, podemos adicionar listeners de evento aos botões do layout
public class TitleLayout extends LinearLayout {
public TitleLayout(Context context, AttributeSet attributes) {
super(context,attributes);
//Definir a view a ser usada
LayoutInflater.from(context).inflate(R.layout.justtitle,this);
//Registrar evento no botão de voltar
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
((Activity)getContext()).finish(); //Voltar é fechar a atividade atual
}
});
//Registrar evento no botão de opções
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getContext(),"Abrir menu",Toast.LENGTH_LONG).show();
}
});
}
}Code language: JavaScript (javascript)
<?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">
<com.foxdevelop.www.testcustom.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>Code language: HTML, XML (xml)

layout