RelativeLayout

Последнее обновление: 14.10.2021

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>
RelativeLayout в Android Studio

Для позиционирования относительно другого элемента, нам надо указать 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 в Android

Программное создание 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());

Тем самым мы указываем относительно какого элемента надо задать расположение.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850