Внутрішні та зовнішні відступи

Параметри розмітки дозволяють задати відступи як від зовнішніх меж елемента до меж контейнера, так і всередині самого елемента між його межами та вмістом.

Зовнішні відступи (Margin)

Для визначення зовнішніх відступів використовується атрибут android:layout_margin. Цей параметр задає відступ між межами елемента та іншими елементами або контейнером. Якщо потрібно окремо встановити відступи для кожної сторони, використовуються такі атрибути:

  • android:layout_marginTop — верхній відступ.
  • android:layout_marginBottom — нижній відступ.
  • android:layout_marginLeft — відступ зліва.
  • android:layout_marginRight — відступ справа.
  • android:layout_marginStart — відступ з початку (для підтримки напрямку тексту).
  • android:layout_marginEnd — відступ із кінця.

!

Приклад використання зовнішніх відступів

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Привіт, світ!"
        android:layout_margin="16dp" />
</LinearLayout>

У цьому прикладі у TextView встановлено відступ у 16dp з усіх сторін.


Внутрішні відступи (Padding)

Внутрішні відступи задають простір між межами елемента та його вмістом. Для цього використовується атрибут android:padding. Як і у випадку з margin, можна окремо вказувати внутрішні відступи для кожної сторони:

  • android:paddingTop — верхній відступ.
  • android:paddingBottom — нижній відступ.
  • android:paddingLeft — відступ зліва.
  • android:paddingRight — відступ справа.
  • android:paddingStart — відступ із початку.
  • android:paddingEnd — відступ із кінця.

!

Приклад використання внутрішніх відступів

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Привіт, світ!"
        android:padding="16dp" />
</LinearLayout>

У цьому прикладі у TextView додано відступ у 16dp всередині елемента.


Спільне використання Margin та Padding

Зовнішні та внутрішні відступи можуть використовуватися одночасно для одного елемента. Наприклад: !

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Привіт, світ!"
        android:layout_margin="16dp"
        android:padding="8dp" />
</LinearLayout>

У цьому випадку відступ у 16dp задається від зовнішніх меж елемента, а відступ у 8dp — між межами елемента та його текстом.


Зверніть увагу, що margin впливає на розташування елемента щодо інших елементів або меж контейнера, а padding — на внутрішній простір самого елемента.

Програмне встановлення відступів

Для програмного встановлення внутрішніх відступів у елементи викликається метод 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);
    }
}

!