RelativeLayout (застарілий)

RelativeLayout представляє об'єкт ViewGroup, який розташовує дочірні елементи відносно позиції інших дочірніх елементів розмітки або відносно області самої розмітки RelativeLayout. Використовуючи відносне позиціонування, ми можемо встановити елемент за правим краєм або по центру чи іншим способом, який надає цей контейнер. Для встановлення елемента у файлі xml ми можемо застосовувати такі атрибути:

  • android:layout_above: розташовує елемент над елементом із зазначеним Id
  • android:layout_below: розташовує елемент під елементом із зазначеним Id
  • android:layout_toLeftOf: розташовується ліворуч від елемента із зазначеним Id
  • android:layout_toRightOf: розташовується праворуч від елемента із зазначеним Id
  • android:layout_toStartOf: розташовує початок поточного елемента, де починається елемент із зазначеним Id
  • android:layout_toEndOf: розташовує початок поточного елемента, де завершується елемент із зазначеним Id
  • android:layout_alignBottom: вирівнює елемент по нижній межі іншого елемента із зазначеним Id
  • android:layout_alignLeft: вирівнює елемент по лівій межі іншого елемента із зазначеним Id
  • android:layout_alignRight: вирівнює елемент по правій межі іншого елемента із зазначеним Id
  • android:layout_alignStart: вирівнює елемент по лінії, біля якої починається інший елемент із зазначеним Id
  • android:layout_alignEnd: вирівнює елемент по лінії, біля якої завершується інший елемент із зазначеним Id
  • android:layout_alignTop: вирівнює елемент по верхній межі іншого елемента із зазначеним Id
  • android:layout_alignBaseline: вирівнює базову лінію елемента по базовій лінії іншого елемента із зазначеним Id
  • android: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());

Тим самим ми вказуємо щодо якого елемента треба задати розташування.