Для создания контейнера в коде Java применяется одноименный класс ConstraintLayout, для создания объекта которого в конструктор передаются значения для ширины и высоты элемента:
ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams
(ConstraintLayout.LayoutParams.WRAP_CONTENT , 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 применяется класс ConstraintLayout.LayoutParams. Он имеет довольно много функционала. Рассмотрим в данном случае только те поля, которые позволяют установить расположение элемента:
baselineToBaseline: выравнивает базовую линию элемента по базовой линии другого элемента, id которого присваивается свойству.
bottomToBottom: выравнивает нижнюю границу элемента по нижней границе другого элемента.
bottomToTop: выравнивает нижнюю границу элемента по верхней границе другого элемента.
leftToLeft: выравнивает левую границу элемента по левой границе другого элемента.
leftToRight: выравнивает левую границу элемента по правой границе другого элемента.
rightToLeft: выравнивает правую границу элемента по левой границе другого элемента.
rightToRight: выравнивает правую границу элемента по правой границе другого элемента.
startToEnd: выравнивает начало элемента по завершению другого элемента.
startToStart: выравнивает начало элемента по началу другого элемента.
topToBottom: выравнивает верхнюю границу элемента по нижней границе другого элемента.
topToTop: выравнивает верхнюю границу элемента по верхней границе другого элемента.
endToEnd: выравнивает заврешение элемента по завершению другого элемента.
endToStart: выравнивает завершение элемента по началу другого элемента.
В качестве значения эти поля принимают id (идентификатор) элемента, относительно которого выполняется позиционирование. Если расположение устанавливается относительно контейнера ConstraintLayout, то применяется константа 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);
//setContentView(R.layout.activity_main);
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);
// позиционирование в левом верхнем углу контейнера
// эквивалент app:layout_constraintLeft_toLeftOf="parent"
layoutParams.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID;
// эквивалент app:layout_constraintTop_toTopOf="parent"
layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
// устанавливаем размеры
textView.setLayoutParams(layoutParams);
// добавляем TextView в ConstraintLayout
constraintLayout.addView(textView);
setContentView(constraintLayout);
}
}
В данном случае значение ConstraintLayout.LayoutParams.WRAP_CONTENT для ширины и высоты указывает, что элемент будет иметь те размеры, которые необходимы для того, чтобы вывести на
экран его содержимое.
Далее выравниваем левую границу элемента по левой стороне контейнера:
layoutParams.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID;
Эта установка аналогична использованию атрибута app:layout_constraintLeft_toLeftOf="parent".
Затем выравниваем верхнюю границу элемента по верхней стороне контейнера:
layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
Эта установка аналогична использованию атрибута app:layout_constraintTop_toTopOf="parent".
И в конце применяем объект ConstraintLayout.LayoutParams к TextView:
constraintLayout.addView(textView);
В итоге элемент TextView будет расположен в верхнем левом углу ConstraintLayout:
Рассмотрим другой пример - установку расположения элементов относительно друг друга:
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);
//setContentView(R.layout.activity_main);
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 вторрого элемента. Если элемент определен в коде Java, то вначале надо сгенерировать идентификатор:
editText.setId(View.generateViewId()); button.setId(View.generateViewId());
Затем можно применять идентификаторы элементов для установки позиционирование позиционионирование. Так, правая граница EditText выравнивается по левой границе кнопки:
editTextLayout.rightToLeft = button.getId();
А левая граница кнопки выравнивается по правой границе элемента EditText:
buttonLayout.leftToRight = editText.getId();