RelativeLayout (застарілий)
RelativeLayout представляє об'єкт ViewGroup, який розташовує дочірні елементи відносно позиції інших дочірніх елементів розмітки або відносно області самої розмітки RelativeLayout. Використовуючи відносне позиціонування, ми можемо встановити елемент за правим краєм або по центру чи іншим способом, який надає цей контейнер. Для встановлення елемента у файлі xml ми можемо застосовувати такі атрибути:
android:layout_above: розташовує елемент над елементом із зазначеним Idandroid:layout_below: розташовує елемент під елементом із зазначеним Idandroid:layout_toLeftOf: розташовується ліворуч від елемента із зазначеним Idandroid:layout_toRightOf: розташовується праворуч від елемента із зазначеним Idandroid:layout_toStartOf: розташовує початок поточного елемента, де починається елемент із зазначеним Idandroid:layout_toEndOf: розташовує початок поточного елемента, де завершується елемент із зазначеним Idandroid:layout_alignBottom: вирівнює елемент по нижній межі іншого елемента із зазначеним Idandroid:layout_alignLeft: вирівнює елемент по лівій межі іншого елемента із зазначеним Idandroid:layout_alignRight: вирівнює елемент по правій межі іншого елемента із зазначеним Idandroid:layout_alignStart: вирівнює елемент по лінії, біля якої починається інший елемент із зазначеним Idandroid:layout_alignEnd: вирівнює елемент по лінії, біля якої завершується інший елемент із зазначеним Idandroid:layout_alignTop: вирівнює елемент по верхній межі іншого елемента із зазначеним Idandroid:layout_alignBaseline: вирівнює базову лінію елемента по базовій лінії іншого елемента із зазначеним Idandroid:layout_alignParentBottom: якщо атрибут має значення true, то елемент притискається до нижньої межі контейнераandroid:layout_alignParentRight: якщо атрибут має значення true, то елемент притискається до правого краю контейнераandroid:layout_alignParentLeft: якщо атрибут має значення true, то елемент притискається до лівого краю контейнераandroid:layout_alignParentStart: якщо атрибут має значення true, то елемент притискається до початкового краю контейнера (за лівосторонньої орієнтації тексту - лівий край)android:layout_alignParentEnd: якщо атрибут має значення true, то елемент притискається до кінцевого краю контейнера (при лівосторонній орієнтації тексту - правий край)android:layout_alignParentTop: якщо атрибут має значення true, то елемент притискається до верхньої межі контейнераandroid:layout_centerInParent: якщо атрибут має значення true, то елемент розташовується по центру батьківського контейнераandroid:layout_centerHorizontal: при значенні true вирівнює елемент по центру по горизонталіandroid:layout_centerVertical: при значенні true вирівнює елемент по центру по вертикалі
Наприклад, позиціонування щодо контейнера RelativeLayout:
<?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:text="Left Top"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textSize="26sp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />
<TextView android:text="Right Top"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textSize="26sp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
<TextView android:text="Left Bottom"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textSize="26sp"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true" />
<TextView android:text="Right Bottom"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textSize="26sp"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true" />
</RelativeLayout>

Для позиціонування відносно іншого елемента, нам треба вказати id цього елемента. Так, помістимо на RelativeLayout текстове поле і кнопку:
<?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">
<EditText
android:id="@+id/edit_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Отправить"
android:layout_alignRight="@id/edit_message"
android:layout_below="@id/edit_message"
/>
</RelativeLayout>
У цьому разі поле EditText розташовується по центру в RelativeLayout, а кнопка поміщається під EditText і вирівнюється по його правій межі:
Програмне створення RelativeLayout
Створимо елемент RelativeLayout програмно в коді Java:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout relativeLayout = new RelativeLayout(this);
EditText editText = new EditText(this);
editText.setId(EditText.generateViewId());
Button button = new Button(this);
button.setText("Отправить");
// встановлюємо параметри положення для EditText
RelativeLayout.LayoutParams editTextParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT
);
// вирівнювання по центру батьківського контейнера
editTextParams.addRule(RelativeLayout.CENTER_IN_PARENT);
// додаємо в RelativeLayout
relativeLayout.addView(editText, editTextParams);
// увстановлюємо параметри положення для Button
RelativeLayout.LayoutParams buttonParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT
);
// вирівнювання праворуч і знизу від поля EditText
buttonParams.addRule(RelativeLayout.BELOW, editText.getId());
buttonParams.addRule(RelativeLayout.ALIGN_RIGHT, editText.getId());
// додаємо в RelativeLayout
relativeLayout.addView(button, buttonParams);
setContentView(relativeLayout);
}
}
Щоб задати положення елемента в контейнері, застосовується клас RelativeLayout.LayoutParams. Через конструктор встановлюються значення для для ширини і висоти. Наприклад, в елемента EditText для ширини встановлюється значення MATCH_PARENT, а для висоти - WRAP_CONTENT.
За допомогою методу addRule() ми можемо додавати додаткові правила для позиціонування елемента. Цей метод як параметр приймає числову константу, яка представляє параметр позиціювання і яка аналогічна атрибуту. Наприклад, атрибуту android:layout_centerInParent відповідатиме константа CENTER_IN_PARENT, а атрибуту android:layout_alignRight константа ALIGN_RIGHT.
Варто зазначити, що з метою спрощення коду для встановлення id у EditText викликається метод generateViewId();, який дає змогу програмно згенерувати id для елемента управління.
Потім встановлений id передається як другий параметр у метод addRule під час встановлення правил для кнопки:
buttonParams.addRule(RelativeLayout.BELOW, editText.getId());
Тим самим ми вказуємо щодо якого елемента треба задати розташування.