Layouts nas visualizações
Um layout define a estrutura de uma interface do usuário no seu app, como em
um
atividade. Todos os elementos na
são criados usando uma hierarquia de
View
e
ViewGroup
objetos. Uma View
geralmente desenha algo que o usuário pode ver e
interagir. Um ViewGroup
é um contêiner invisível que define
a estrutura de layout para View
e outros ViewGroup
objetos, como mostrado na figura 1.
Objetos View
geralmente são chamados de widgets e podem ser um dos
muitas subclasses, como
Button
ou
TextView
. A
Objetos ViewGroup
geralmente são chamados de layouts e podem ser um
de muitos tipos que oferecem uma estrutura de layout diferente, como
LinearLayout
ou
ConstraintLayout
Um layout pode ser declarado de duas maneiras:
- Declarar elementos da interface em XML. O Android fornece um XML simples
vocabulário correspondente às classes e subclasses de
View
, como widgets e layouts. Você também pode usar o Layout Editor para criar o XML usando uma interface de arrastar e soltar. - Instanciar elementos do layout no momento da execução. Seu app pode criar
objetos
View
eViewGroup
e manipule os respectivos propriedades de forma programática.
Declarar a interface em XML permite separar a apresentação do app dos o código que controla o comportamento dele. O uso de arquivos XML também facilita fornecem diferentes layouts para diferentes tamanhos e orientações de tela. Isso é discutidos mais detalhadamente em Suporte a telas diferentes tamanhos.
O framework do Android oferece a flexibilidade de usar um ou ambos os esses métodos para criar a interface do seu app. Por exemplo, é possível declarar layouts padrão em XML e depois modificar o layout no tempo de execução.
Programação do XML
Com o vocabulário XML do Android, é possível criar rapidamente layouts de interface e as os elementos de tela que eles contêm, da mesma forma que você cria páginas da Web em HTML com uma série de elementos aninhados.
Cada arquivo de layout deve conter exatamente um elemento raiz, que deve ser um
Objeto View
ou ViewGroup
. Depois de definir a raiz
é possível adicionar outros objetos ou widgets de layout como elementos filhos ao
crie gradualmente uma hierarquia View
que defina o layout. Para
exemplo, este é um layout XML que usa um LinearLayout
vertical para
mantenham uma TextView
e uma Button
:
<?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:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a TextView" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a Button" /> </LinearLayout>
Depois de declarar o layout em XML, salve o arquivo com o
Extensão .xml
no res/layout/
do seu projeto Android
para que ele seja compilado corretamente.
Para mais informações sobre a sintaxe de um arquivo XML de layout, consulte Recurso de layout.
Carregar o recurso XML
Ao compilar o aplicativo, cada arquivo de layout XML é compilado em um
recurso View
. Carregue o recurso de layout na interface
Activity.onCreate()
implementação de callback. Para isso, chame
setContentView()
,
passando a referência para o recurso de layout no formulário:
R.layout.layout_file_name
. Por exemplo, se o arquivo XML
layout foi salvo como main_layout.xml
, carregue-o para seu
Activity
da seguinte maneira:
Kotlin
fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) setContentView(R.layout.main_layout) }
Java
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); }
O framework do Android chama o método de callback onCreate()
seu Activity
quando o Activity
for iniciado. Para mais
informações sobre ciclos de vida de atividades, consulte
Introdução ao
atividades.
Atributos
Cada objeto View
e ViewGroup
é compatível com os próprios
diversos atributos XML. Alguns atributos são específicos de uma View
objeto. Por exemplo, TextView
é compatível com textSize
.
. No entanto, esses atributos também são herdados por qualquer View
que estendem essa classe. Alguns são comuns a todos os View
objetos, porque eles são herdados da classe raiz View
, como
o atributo id
. Outros atributos são considerados layout
parâmetros, que são atributos que descrevem determinadas orientações de layout
do objeto View
, conforme definido pelo objeto pai desse objeto
objeto ViewGroup
.
ID
Qualquer objeto View
pode ter um ID de número inteiro associado a ele para
identificar exclusivamente o View
dentro da árvore. Quando o app é
compilado, esse ID é referenciado como um número inteiro, mas normalmente é atribuído
no arquivo XML de layout como uma string no atributo id
. Esta é uma
Atributo XML comum a todos os objetos View
e é definido pelo
View
. Você a usa com muita frequência. A sintaxe de um ID dentro de uma
A tag XML é a seguinte:
android:id="@+id/my_button"
O símbolo a (@) no início da string indica que
o analisador XML analisa e expande o resto da string de ID e a identifica como
um recurso de ID. O símbolo de adição (+) significa que esse é um novo nome de recurso.
que precisa ser criado e adicionado aos recursos no R.java
.
O framework do Android oferece muitos outros recursos de ID. Ao mencionar uma
ID de recurso do Android, o sinal de adição não é necessário, mas é necessário adicionar o
android
da seguinte maneira:
android:id="@android:id/empty"
O namespace do pacote android
indica que você está fazendo referência
um ID da classe de recursos android.R
, em vez do
classe de recursos.
Para criar visualizações e referenciá-las no seu app, você pode usar uma da seguinte maneira:
- Defina uma visualização no arquivo de layout e atribua a ela um ID exclusivo, como no
exemplo a seguir:
<Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/my_button_text"/>
- Crie uma instância do objeto de visualização e capture-a no layout.
normalmente na
onCreate()
, como mostrado no exemplo a seguir:Kotlin
val myButton: Button = findViewById(R.id.my_button)
Java
Button myButton = (Button) findViewById(R.id.my_button);
Definir IDs para objetos de visualização é importante ao criar um
RelativeLayout
:
Em um layout relativo, as visualizações irmãs podem definir o layout relativo a outra
visualização irmã, que é referenciada pelo ID exclusivo.
Um ID não precisa ser exclusivo em toda a árvore, mas deve ser exclusivos dentro da parte da árvore que você pesquisa. Muitas vezes, pode ser toda a então é melhor torná-la única sempre que possível.
Parâmetros de layout
Os atributos de layout XML chamados layout_something
definem
parâmetros de layout para o View
adequados para os
ViewGroup
em que ela está localizada.
Cada classe ViewGroup
implementa uma classe aninhada que estende
ViewGroup.LayoutParams
.
Essa subclasse contém tipos de propriedade que definem o tamanho e a posição de cada
visualização filha, conforme apropriado para o grupo de visualizações. Como mostrado na Figura 2,
o grupo de visualizações define os parâmetros de layout para cada visualização filha, incluindo a
de visualização em grupo.
Cada subclasse LayoutParams
tem a própria sintaxe para configuração.
e a distribuição dos valores dos dados. Cada elemento filho precisa definir um LayoutParams
que seja
apropriado para seu pai, embora também possa definir uma
LayoutParams
para os próprios filhos.
Todos os grupos de visualizações incluem largura e altura usando layout_width
.
e layout_height
, e cada visualização é necessária para defini-los. Muitas
LayoutParams
incluem margens e bordas opcionais.
É possível especificar largura e altura com medidas exatas, querem fazer isso com frequência. Em geral, usa-se uma dessas constantes para definir a largura ou altura:
wrap_content
: instrui a visualização a se dimensionar de acordo com o as dimensões exigidas pelo conteúdo.match_parent
: faz com que a visualização fique do tamanho da mãe. visualização em grupo permite.
Em geral, não recomendamos especificar a largura e a altura de um layout usando
unidades absolutas, como pixels. Uma abordagem melhor é usar medidas relativas,
como unidades de pixel de densidade independente (dp), wrap_content
ou
match_parent
, porque ajuda o app a ser exibido corretamente em um
uma variedade de tamanhos de tela de dispositivos. Os tipos de medidas aceitos são definidos em
Recurso de layout.
Posição do layout
Uma visualização tem geometria retangular. Ele tem uma localização, expressa como um par de coordenadas esquerda e superior e duas dimensões, expressas como um largura e altura. A unidade de localização e de dimensões é o pixel.
Você pode recuperar a localização de uma visualização invocando os métodos
getLeft()
e
getTop()
.
O primeiro retorna a coordenada esquerda (x) do retângulo que representa
a visualização. O último retorna a coordenada superior (y) do retângulo
que representam a visualização. Esses métodos retornam a localização da visualização em relação à
seu pai. Por exemplo, quando getLeft()
retornar 20, isso significa que o
está localizada 20 pixels à direita da borda esquerda do
pai
Além disso, há métodos de conveniência para evitar cálculos desnecessários:
ou seja,
getRight()
e
getBottom()
.
Esses métodos retornam as coordenadas das bordas direita e inferior do
retângulo que representa a visualização. Por exemplo, chamar getRight()
é
semelhante ao seguinte cálculo: getLeft() + getWidth()
.
Tamanho, preenchimento e margens
O tamanho de uma visualização é expresso por largura e altura. Uma visualização tem dois pares de valores de largura e altura.
O primeiro par é conhecido como largura medida e
altura medida. Essas dimensões definem o tamanho da visualização
dentro do pai. Para ter as dimensões medidas, chame
getMeasuredWidth()
e
getMeasuredHeight()
.
O segundo par é conhecido como largura e altura ou, às vezes,
largura do desenho e altura do desenho. Essas dimensões definem
tamanho real da visualização na tela, na hora do desenho e após o layout. Esses
valores podem diferir da largura e da altura medidas. Você
pode obter a largura e a altura chamando
getWidth()
e
getHeight()
.
Para medir as dimensões, a visualização leva em conta o preenchimento. O padding
é expresso em pixels para as partes esquerda, superior, direita e inferior da visualização.
Você pode usar o preenchimento para deslocar o conteúdo da visualização por um número específico de
pixels. Por exemplo, um padding esquerdo de dois empurra o conteúdo da visualização em dois pixels
à direita da borda esquerda. Você pode definir o padding usando a propriedade
setPadding(int, int, int, int)
e consultá-lo chamando
getPaddingLeft()
,
getPaddingTop()
,
getPaddingRight()
,
e
getPaddingBottom()
.
Embora uma visualização possa definir um padding, ela não é compatível com margens. No entanto,
que não oferecem suporte a margens. Consulte
ViewGroup
e
ViewGroup.MarginLayoutParams
para mais informações.
Para mais informações sobre as dimensões, consulte Dimensão.
Além de definir as margens e o padding de forma programática, também é possível defini-los nos seus layouts XML, conforme mostrado no exemplo a seguir:
<?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:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="16dp" android:padding="8dp" android:text="Hello, I am a TextView" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:paddingBottom="4dp" android:paddingEnd="8dp" android:paddingStart="8dp" android:paddingTop="4dp" android:text="Hello, I am a Button" /> </LinearLayout>
O exemplo anterior mostra a margem e o padding sendo aplicados. A
TextView
tem margens uniformes e padding aplicados ao redor, e
o Button
mostra como aplicá-los de maneira independente a diferentes
pontas.
Layouts comuns
Cada subclasse da classe ViewGroup
fornece uma maneira única de
exibir as visualizações aninhadas dentro dele. O tipo de layout mais flexível, e o
que fornece as melhores ferramentas para manter sua hierarquia de layout superficial, é
ConstraintLayout
:
Estes são alguns dos tipos de layout comuns integrados ao Android de plataforma.
Ela organiza os filhos em uma única linha horizontal ou vertical e cria uma barra de rolagem se o comprimento da janela excede o comprimento da tela.
Criar listas dinâmicas
Quando o conteúdo de seu layout é dinâmico ou não predeterminado, é possível
usam
RecyclerView
ou
uma subclasse de
AdapterView
.
RecyclerView
geralmente é a melhor opção, porque usa memória
de forma mais eficiente do que AdapterView
.
Layouts comuns possíveis com RecyclerView
e
AdapterView
incluem o seguinte:
RecyclerView
oferece mais possibilidades e
a opção de
criar um
gerenciador de layout.
Preencher uma visualização de adaptador com dados
É possível preencher um
AdapterView
como ListView
ou
GridView
por
vinculando a instância de AdapterView
Adapter
,
que recupera dados de uma fonte externa e cria uma View
que representa cada entrada de dados.
O Android oferece várias subclasses de Adapter
que são úteis
para recuperar diferentes tipos de dados e criar visualizações para um
AdapterView
. Os dois adaptadores mais comuns são:
ArrayAdapter
- Use esse adaptador quando a fonte de dados for uma matriz. Por padrão,
ArrayAdapter
cria uma visualização para cada item da matriz chamandotoString()
em cada item e colocando o conteúdo em umaTextView
.Por exemplo, se você tem uma matriz de strings que deseja exibir em um
ListView
, inicialize um novoArrayAdapter
usando uma construtor para especificar o layout de cada string e a matriz de strings:Kotlin
val adapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myStringArray)
Java
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myStringArray);
Os argumentos para esse construtor são os seguintes:
- Seu app
Context
- O layout que contém uma
TextView
para cada string no matriz - A matriz de strings
Em seguida, chame
setAdapter()
no seuListView
:Kotlin
val listView: ListView = findViewById(R.id.listview) listView.adapter = adapter
Java
ListView listView = (ListView) findViewById(R.id.listview); listView.setAdapter(adapter);
Para personalizar a aparência de cada item, você pode substituir o Método
toString()
para os objetos em sua matriz. Ou, para criar uma visualização de cada item que não seja umaTextView
: por exemplo, se você quiser que umaImageView
para cada item da matriz, ou seja, estenda a classeArrayAdapter
e sobrepor-segetView()
para retornar o tipo de visualização que você quer para cada item. - Seu app
SimpleCursorAdapter
- Use esse adaptador quando seus dados vierem de um
Cursor
. Ao usarSimpleCursorAdapter
, especifique um layout a ser usado para cada linha noCursor
e quais colunas naCursor
que você quer inserir nas visualizações do layout pretendido. Por exemplo, se você quiser criar uma lista de nomes e telefones é possível realizar uma consulta que retorna umCursor
que contém uma linha para cada pessoa e colunas para os nomes e números. Você depois criar uma matriz de strings especificando quais colunas daCursor
que você quer no layout de cada resultado e um número inteiro matriz especificando as visualizações correspondentes que cada coluna precisa ser colocado:Kotlin
val fromColumns = arrayOf(ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER) val toViews = intArrayOf(R.id.display_name, R.id.phone_number)
Java
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}; int[] toViews = {R.id.display_name, R.id.phone_number};
Quando você instanciar o
SimpleCursorAdapter
, transmita o o layout a ser usado para cada resultado, oCursor
contendo o e estas duas matrizes:Kotlin
val adapter = SimpleCursorAdapter(this, R.layout.person_name_and_number, cursor, fromColumns, toViews, 0) val listView = getListView() listView.adapter = adapter
Java
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.person_name_and_number, cursor, fromColumns, toViews, 0); ListView listView = getListView(); listView.setAdapter(adapter);
Em seguida, o
SimpleCursorAdapter
cria uma visualização para cada linha no oCursor
usando o layout fornecido, inserindo cadafromColumns
item notoViews
correspondente. visualização.
Se, ao longo da vida útil do aplicativo, você mudar os dados subjacentes que
for lida pelo adaptador, chame
notifyDataSetChanged()
:
Isso notifica a visualização anexada de que os dados foram alterados e atualizados.
por conta própria.
Processar eventos de clique
É possível responder a eventos de clique em cada item de uma AdapterView
implementando
AdapterView.OnItemClickListener
interface gráfica do usuário. Exemplo:
Kotlin
listView.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> // Do something in response to the click. }
Java
// Create a message handling object as an anonymous class. private OnItemClickListener messageClickedHandler = new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { // Do something in response to the click. } }; listView.setOnItemClickListener(messageClickedHandler);
Outros recursos
Veja como os layouts são usados no Girassol app de demonstração (link em inglês) no GitHub.