Макет Android — LinearLayout, RelativeLayout
В этом уроке мы представим обзор макета Android. Мы также рассмотрим некоторые специальные элементы управления макетом, доступные для организации содержимого экрана, а именно — Android LinearLayout и Android RelativeLayout.
Макет Android
Основным строительным блоком для пользовательского интерфейса является объект View, который создается из класса View и занимает прямоугольную область на экране. Представления — это базовый класс для компонентов пользовательского интерфейса, таких как TextView, Button, EditText и т. д. ViewGroup — это подкласс View. Одно или несколько представлений можно сгруппировать в ViewGroup. ViewGroup предоставляет макет Android, в котором мы можем упорядочить внешний вид и последовательность представлений. Примерами ViewGroup являются LinearLayout
, FrameLayout
, RelativeLayout
и т. д.
Типы макетов Android
Android предоставляет следующие ViewGroups или макеты:
LinearLayout
: ViewGroup, которая выравнивает все дочерние элементы в одном направлении, вертикально или горизонтальноRelativeLayout
: это ViewGroup, которая отображает дочерние представления в относительных позицияхAbsoluteLayout
: позволяет указать точное расположение дочерних представлений и виджетовTableLayout
– это представление, которое группирует дочерние представления в строки и столбцы.FrameLayout
– это заполнитель на экране, который используется для отображения одного вида.ScrollView
: это особый тип FrameLayout, который позволяет пользователям прокручивать список представлений, занимающих больше места, чем физический дисплей. ScrollView может содержать только одно дочернее представление или ViewGroup, обычно это LinearLayoutListView
– это группа представлений, в которой отображается список прокручиваемых элементов.GridView
: это ViewGroup, которая отображает элементы в двумерной прокручиваемой сетке. Элементы в сетке поступают из ListAdapter, связанного с этим представлением.
В этом уроке мы сосредоточимся на двух наиболее часто используемых макетах Android:
- Линейный макет
- Относительный макет
Атрибуты макета Android
- android:id : это идентификатор, который однозначно идентифицирует представление.
- android:layout_width : ширина макета.
- android:layout_height : высота макета.
- android:layout_margin : это дополнительное пространство за пределами представления. Например, если вы укажете
android:marginLeft=20dp
, представление будет располагаться через 20 dp слева - android:layout_padding : похоже на android:layout_margin, за исключением того, что указывает дополнительное пространство внутри представления.
- android:layout_gravity : указывает, как позиционируются дочерние представления.
- android:layout_weight : указывает, сколько дополнительного пространства в макете должно быть выделено для представления.
- android:layout_x : указывает координату X макета.
- android:layout_y : указывает координату Y макета.
android:layout_width=wrap_content указывает размеру представления, чтобы оно соответствовало размерам, требуемым его содержимым. android:layout_width=match_parent сообщает, что представление становится таким же большим, как его родительское представление.
Посмотреть идентификацию
Синтаксис идентификатора внутри тега XML:
- Символ at (@) в начале строки указывает, что синтаксический анализатор XML должен проанализировать и расширить остальную часть строки идентификатора и идентифицировать ее как ресурс идентификатора.
- Символ плюса (+) означает, что это новое имя ресурса, которое необходимо создать и добавить к нашим ресурсам.
Android LinearLayout
Android LinearLayout упорядочивает элементы вдоль одной строки. Мы можем указать, является ли эта линия вертикальной или горизонтальной, используя android:orientation
. Ориентация по умолчанию горизонтальная. Вертикальный LinearLayout будет иметь только один дочерний элемент на строку (поэтому это столбец из отдельных элементов), а горизонтальный LinearLayout будет иметь только одну единственную строку элементов на экране. Атрибут android:layout_weight отображает важность элемента. Элемент с большим весом занимает больше места на экране. Вот пример макета XML с использованием LinearLayout: layout_linear.xml
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="@dimen/activity_horizontal_margin">
<Button
android:id="@+id/backbutton"
android:text="Back"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="Row 2"
android:layout_width="wrap_content"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_height="wrap_content" />
<TextView
android:text="Row 3"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="Row 4"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="Row 5"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/next_button"
android:text="next"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="Row 6b"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="Row 6c"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="Row 6d"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
В этом макете у нас есть родительский LinearLayout
, который имеет вертикальную ориентацию и содержит кнопки, текстовые представления и вложенный линейный макет (с горизонтальной ориентацией) в качестве дочерних представлений. Примечание. Вложенные макеты не обязательно должны быть одного типа. Мы могли бы, например, сделать LinearLayout одним из дочерних элементов RelativeLayout и наоборот.
Относительный макет Android
Android RelativeLayout размещает элементы на основе их отношений друг с другом и с родительским контейнером. Это один из самых сложных макетов, и нам нужно несколько свойств, чтобы действительно получить желаемый макет. То есть, используя RelativeLayout, мы можем расположить представление так, чтобы оно было toLeftOf, toRightOf, ниже или выше его братьев и сестер. Мы также можем расположить представление по отношению к его родителю, например, по центру по горизонтали, вертикали или по обоим направлениям, или выровнять его по любому из краев родительского элемента RelativeLayout
. Если ни один из этих атрибутов не указан в дочернем представлении, то представление по умолчанию отображается в верхнем левом положении.
Атрибуты Android RelativeLayout
Ниже приведены основные атрибуты, используемые в RelativeLayout. Они относятся к трем различным категориям:
Относительно контейнера
- android:layout_alignParentBottom : помещает нижнюю часть элемента в нижнюю часть контейнера.
- android:layout_alignParentLeft : помещает левую часть элемента в левую часть контейнера.
- android:layout_alignParentRight : размещает правую часть элемента в правой части контейнера.
- android:layout_alignParentTop : размещает элемент в верхней части контейнера
- android:layout_centerHorizontal: центрирует элемент по горизонтали внутри родительского контейнера.
- android:layout_centerInParent: центрирует элемент как по горизонтали, так и по вертикали внутри его контейнера.
- android:layout_centerVertical: центрирует элемент по вертикали внутри родительского контейнера.
По отношению к братьям и сестрам
- android:layout_above : размещает элемент над указанным элементом
- android:layout_below : размещает элемент под указанным элементом
- android:layout_toLeftOf : помещает элемент слева от указанного элемента
- android:layout_toRightOf : размещает элемент справа от указанного элемента
\@id/XXXXX используется для ссылки на элемент по его идентификатору. Следует помнить, что ссылка на элемент до его объявления приведет к ошибке, поэтому в таких случаях следует использовать @+id/.
Выравнивание с другими элементами
- android:layout_alignBaseline: выравнивает базовую линию нового элемента с базовой линией указанного элемента.
- android:layout_alignBottom: выравнивает нижний край нового элемента по нижнему краю указанного элемента.
- android:layout_alignLeft : выравнивает левый край нового элемента с левым краем указанного элемента.
- android:layout_alignRight: выравнивает правый край нового элемента с правым краем указанного элемента.
- android:layout_alignTop : размещает верхнюю часть нового элемента на одном уровне с верхней частью указанного элемента.
В следующем XML-макете используется RelativeLayout
: layout_relative.xml
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="https://schemas.android.com/apk/res/android">
<Button
android:id="@+id/backbutton"
android:text="Back"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/firstName"
android:text="First Name"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/backbutton" />
<TextView
android:id="@+id/editFirstName"
android:text="JournalDev"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_marginLeft="10dp"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/firstName"
android:layout_below="@id/backbutton"/>
<TextView
android:id="@+id/editLastName"
android:text="Layout Tutorial Example"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/lastName"
android:layout_toRightOf="@+id/lastName"
android:layout_toEndOf="@+id/lastName" />
<TextView
android:id="@+id/lastName"
android:text="Last Name"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="48dp"
android:layout_below="@+id/firstName"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginRight="10dp"
android:layout_marginLeft="40dp"
android:layout_marginStart="40dp" />
<Button
android:id="@+id/next"
android:text="Next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editLastName"
android:layout_alignLeft="@+id/editLastName"
android:layout_alignStart="@+id/editLastName"
android:layout_marginTop="37dp" />
</RelativeLayout>
Как видите, мы можем переставлять элементы в зависимости от их относительного положения. Следующий XML-макет представляет собой настраиваемый макет с вложенными линейными и относительными макетами. layout_mixed.xml
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="https://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/parent_rl"
android:text="Parent RelativeLayout"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout"
android:layout_below="@id/parent_rl"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true">
<TextView
android:text="Nested Horizontal"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="LL"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:text="Double Nested"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="Vertical"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="LL"
android:textSize="18sp"
android:layout_margin="10dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/linearLayout">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Nested Relative Layout"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<Button
android:id="@+id/back_button_pressed"
android:text="back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:layout_marginTop="66dp" />
</RelativeLayout>
</RelativeLayout>
Структура проекта макета Android
Код макета Android
Приложение запускается в MainActivity, которая загружает содержимое layout_linear.xml
с помощью следующего кода:
package com.journaldev.layouts;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button back,next;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_linear);
back=(Button)findViewById(R.id.back_button);
next=(Button)findViewById(R.id.next_button);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
SecondActivity
и ThirdActivity
загружают макеты layout_relative.xml
и layout_mixed.xml
соответственно, как показано ниже:
package com.journaldev.layouts;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class SecondActivity extends Activity {
Button back,next;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_relative);
back=(Button)findViewById(R.id.backbutton);
next=(Button)findViewById(R.id.next);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(SecondActivity.this,ThirdActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(SecondActivity.this,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
}
}
package com.journaldev.layouts;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class ThirdActivity extends Activity {
Button back;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_mixed);
back=(Button)findViewById(R.id.back_button_pressed);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(ThirdActivity.this,SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
}
}
Скачать пример проекта Android LinearLayout RelativeLayout
Ссылка: документ API