Параметры разметки позволяют задать отступы как от внешних границ элемента до границ контейнера, так и внутри самого элемента между его границами и содержимым.
Для установки внутренних отступов применяется атрибут 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); } }