💀
Второй курс РПО
Android
Android
  • Глава 1. Начало работы с Android
    • Начало работы с Android
    • Первый проект в Android Studio
    • Создание графического интерфейса
  • Глава 2. Основы создания интерфейса
    • Основы создания интерфейса
    • Определение интерфейса в файле XML. Файлы layout
    • Определение размеров
    • Ширина и высота элементов
    • Внутренние и внешние отступы
    • ConstraintLayout
    • Размеры элементов в ConstraintLayout
    • Цепочки элементов в ConstraintLayout
    • Программное создание ConstraintLayout и позиционирование
Powered by GitBook
On this page
  • Пример с точными размерами
  • Настройка позиционирования
  • Пример: позиционирование в левом верхнем углу контейнера
  • Пример: размещение элементов относительно друг друга
  • Пример выравнивания
  1. Глава 2. Основы создания интерфейса

Программное создание ConstraintLayout и позиционирование

16.01.2025

Для создания контейнера в коде Java применяется одноименный класс ConstraintLayout. Для создания объекта используется конструктор, принимающий значения для ширины и высоты элемента:

ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(
    ConstraintLayout.LayoutParams.WRAP_CONTENT, 
    ConstraintLayout.LayoutParams.WRAP_CONTENT
);
  • Первый параметр: ширина элемента.

  • Второй параметр: высота элемента.

ConstraintLayout.LayoutParams.WRAP_CONTENT указывает, что размеры элемента соответствуют его содержимому. Также можно использовать ConstraintLayout.LayoutParams.MATCH_CONSTRAINT, аналогичный 0dp в атрибутах layout_width и layout_height, который растягивает элемент до размеров контейнера.

Пример с точными размерами

ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(
    ConstraintLayout.LayoutParams.MATCH_CONSTRAINT, 200
);

Настройка позиционирования

Для управления позиционированием используется класс ConstraintLayout.LayoutParams. Ниже перечислены его основные поля для установки расположения:

  • baselineToBaseline — базовая линия элемента относительно другого.

  • bottomToBottom — нижняя граница элемента по нижней границе другого.

  • bottomToTop — нижняя граница элемента по верхней границе другого.

  • leftToLeft — левая граница элемента по левой границе другого.

  • leftToRight — левая граница элемента по правой границе другого.

  • rightToLeft — правая граница элемента по левой границе другого.

  • rightToRight — правая граница элемента по правой границе другого.

  • startToEnd, startToStart, endToEnd, endToStart — выравнивание по началу или завершению элемента.

  • topToBottom, topToTop — верхняя граница элемента относительно другого.

Значением для этих полей служит id элемента. Для позиционирования относительно контейнера используется ConstraintLayout.LayoutParams.PARENT_ID.

Пример: позиционирование в левом верхнем углу контейнера

package com.example.viewapp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        ConstraintLayout constraintLayout = new ConstraintLayout(this);
        TextView textView = new TextView(this);

        textView.setText("Hello Android");
        textView.setTextSize(30);

        ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(
            ConstraintLayout.LayoutParams.WRAP_CONTENT, 
            ConstraintLayout.LayoutParams.WRAP_CONTENT
        );

        layoutParams.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID;
        layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
        textView.setLayoutParams(layoutParams);

        constraintLayout.addView(textView);
        setContentView(constraintLayout);
    }
}

Элемент TextView будет расположен в верхнем левом углу контейнера. Это эквивалентно:

app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"

Пример: размещение элементов относительно друг друга

package com.example.viewapp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ConstraintLayout constraintLayout = new ConstraintLayout(this);

        EditText editText = new EditText(this);
        editText.setHint("Введите Email");
        editText.setId(View.generateViewId());

        Button button = new Button(this);
        button.setText("Отправить");
        button.setId(View.generateViewId());

        ConstraintLayout.LayoutParams editTextLayout = new ConstraintLayout.LayoutParams(
            ConstraintLayout.LayoutParams.WRAP_CONTENT, 
            ConstraintLayout.LayoutParams.WRAP_CONTENT
        );

        editTextLayout.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID;
        editTextLayout.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
        editTextLayout.rightToLeft = button.getId();
        editText.setLayoutParams(editTextLayout);

        constraintLayout.addView(editText);

        ConstraintLayout.LayoutParams buttonLayout = new ConstraintLayout.LayoutParams(
            ConstraintLayout.LayoutParams.WRAP_CONTENT, 
            ConstraintLayout.LayoutParams.WRAP_CONTENT
        );

        buttonLayout.leftToRight = editText.getId();
        buttonLayout.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
        button.setLayoutParams(buttonLayout);

        constraintLayout.addView(button);
        setContentView(constraintLayout);
    }
}

При размещении элементов друг относительно друга сначала нужно сгенерировать их id:

editText.setId(View.generateViewId());
button.setId(View.generateViewId());

Пример выравнивания

  • Правая граница EditText по левой границе Button:

editTextLayout.rightToLeft = button.getId();
  • Левая граница Button по правой границе EditText:

buttonLayout.leftToRight = editText.getId();
PreviousЦепочки элементов в ConstraintLayout

Last updated 4 months ago