Параметры разметки позволяют задать отступы как от внешних границ элемента до границ контейнера, так и внутри самого элемента между его границами и содержимым.
Для установки внутренних отступов применяется атрибут android:padding. Он устанавливает отступы контента от всех четырех сторон контейнера. Можно устанавливать отступы только от одной стороны контейнера, применяя следующие атрибуты: android:paddingLeft, android:paddingRight, android:paddingTop и android:paddingBottom.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="50dp"
tools:context=".MainActivity">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Hello World!"
android:textSize="30sp"
android:background="#e0e0e0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
У контейнера ConstraintLayout установлен только один общий внутренний отступ в 50 единиц. Вложенный элемент TextView позиционируется в левом верхнем углу контейнера
(благодаря атрибутам app:layout_constraintLeft_toLeftOf="parent" и app:layout_constraintTop_toTopOf="parent"). .
Поэтому TextView будет отодвигаться от начальной точки (левый верхний угол контейнера ConstraintLayout) вниз и влево на 50 единиц. Кроме того, такие
же отступы будут действовать справа и снизу, если элемент будет примыкать к нижней или правой границе контейнера.
Установка одного отступа
android:padding="50dp"
Будет аналогична установке четырех отступов
android:paddingTop="50dp" android:paddingLeft="50dp" android:paddingBottom="50dp" android:paddingRight="50dp"
Подобным образом можно установить отступы в других элементах. Например, установим внутри TextView сверху и снизу от внутреннего содержимого (то есть текста) отступы в 60 единиц и отступы слева и справа в 40 единиц:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="50dp"
tools:context=".MainActivity">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:paddingTop="60dp"
android:paddingLeft="40dp"
android:paddingRight="40dp"
android:paddingBottom="60dp"
android:text="Hello World!"
android:textSize="30sp"
android:background="#e0e0e0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
Стоит отметить, что вместо атрибутов android:paddingLeft и android:paddingRight можно применять атрибуты
android:paddingStart и android:paddingEnd, которые разработаны специально адаптации приложения для работы как для языков с левосторонней ориентацией,
так и правосторонней ориентацией (арабский, фарси).
Для установки внешних отступов используется атрибут layout_margin. Данный атрибут имеет
модификации, которые позволяют задать отступ только от одной стороны: android:layout_marginBottom, android:layout_marginTop,
android:layout_marginLeft и android:layout_marginRight (отступы соответственно от нижней, верхней, левой и правой границ):
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginTop="50dp"
android:layout_marginLeft="60dp"
android:text="Hello World!"
android:textSize="30sp"
android:background="#e0e0e0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
Здесь у TextView задаются отступы от двух сторон ConstraintLayout (слева 60 единиц и сверху 50 единиц):
Для программной установки внутренних отступов у элементы вызывается метод setPadding(left, top, right, bottom), в который передаются четыре значения для каждой из сторон. Также можно по отдельности задать отступы с помощью методов getPaddingLeft(), getPaddingTop(), getPaddingRight() и getPaddingBottom().
Для установки внешних отступов необходимо реализовать объект LayoutParams для того контейнера, который применяется. И затем вызвать у этого объекта LayoutParams метод setMargins(left, top, right, bottom):
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.setBackgroundColor(0xFFE0E0E0);
// установка текста текстового поля
textView.setText("Hello Android");
// установка размера текста
textView.setTextSize(30);
ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams
(ConstraintLayout.LayoutParams.WRAP_CONTENT , ConstraintLayout.LayoutParams.WRAP_CONTENT);
// установка внешних отступов
layoutParams.setMargins(60, 50, 60, 50);
// позиционирование в левом верхнем угду контейнера
// эквивалент 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.setPadding(40,40,40,40);
// добавляем TextView в ConstraintLayout
constraintLayout.addView(textView);
setContentView(constraintLayout);
}
}
Поскольку в данном случае элемент TextView добавляется в контейнер типа ConstraintLayout, то для его позиционирования применяется объект ConstraintLayout.LayoutParams (соответственно для LinearLayout это будет LinearLayout.LayoutParams), у которого вызывается метод setMargins().
Но если посмотреть на последний скриншот, то можно увидеть, что, несмотря на то, что отступы вроде бы заданы также, что и в предпоследнем примере в файле
layout, однако в реальности на экране мы увидим отступы со совсем другими значениями. Дело в том, что методы setPadding() и setMargins()
принимают значения в пикселях, тогда как в файле layout применялись единицы dp. И чтобы использовать dp также в коде, необходимо выполнить преобразования:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import android.os.Bundle;
import android.util.TypedValue;
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.setBackgroundColor(0xFFE0E0E0);
textView.setText("Hello Android!");
textView.setTextSize(30);
// получаем отступ в пикселях для 50 dp
int margin50inDp = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics());
// получаем отступ в пикселях для 60 dp
int margin60inDp = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 60, getResources().getDisplayMetrics());
// получаем отступ в пикселях для 40 dp
int padding40inDp = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 40, getResources().getDisplayMetrics());
ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams
(ConstraintLayout.LayoutParams.WRAP_CONTENT , ConstraintLayout.LayoutParams.WRAP_CONTENT);
// установка внешних отступов
layoutParams.setMargins(margin60inDp, margin50inDp, margin60inDp, margin50inDp);
// выравнивание по левому краю ConstraintLayout
layoutParams.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID;
// выравнивание по верхней границе ConstraintLayout
layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
// устанавливаем размеры
textView.setLayoutParams(layoutParams);
// установка внутренних отступов
textView.setPadding(padding40inDp, padding40inDp, padding40inDp, padding40inDp);
// добавляем TextView в ConstraintLayout
constraintLayout.addView(textView);
setContentView(constraintLayout);
}
}