FrameLayout

Контейнер FrameLayout призначений для виведення на екран одного поміщеного в нього візуального елемента. Якщо ж ми помістимо кілька елементів, то вони накладатимуться один на одного. Проте також можна розташовувати в FrameLayout кілька елементів.

Припустимо, вкладемо в FrameLayout два елементи TextView:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="26sp"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello Android!"
        android:textSize="26sp"
        android:layout_marginTop="50dp"/>
 
</FrameLayout>

Тут обидва елементи позиціонуються в одне й те саме місце - у лівий верхній кут контейнера FrameLayout, і щоб уникнути накладення, у цьому разі у другого TextView встановлюється відступ зверху в 50 одиниць.

Нерідко FrameLayout застосовується для створення похідних контейнерів, наприклад, ScrollView, який забезпечує прокрутку.

Елементи керування, які поміщаються у FrameLayout, можуть встановити своє позиціонування за допомогою атрибута android:layout_gravity:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="26sp"
        android:layout_gravity="center_horizontal" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Welcome to Java World"
        android:textSize="26sp"
        android:layout_gravity="center"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello Android!"
        android:textSize="26sp"
        android:layout_gravity="bottom|center_horizontal"/>
 
</FrameLayout>

Під час зазначення значення ми можемо комбінувати низку значень, розділяючи їх вертикальною рискою: bottom|center_horizontal

Програмне створення FrameLayout у коді MainActivity:

package com.example.viewapp;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.os.Bundle;
import android.view.Gravity;
import android.widget.FrameLayout;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        FrameLayout frameLayout = new FrameLayout(this);
        TextView textView = new TextView(this);
        textView.setText("Hello World!");
 
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams
                (FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
 
        textView.setLayoutParams(layoutParams);
        textView.setTextSize(26);
        frameLayout.addView(textView);
        setContentView(frameLayout);
    }
}

FrameLayout — це простий контейнер, що дозволяє розташовувати елементи один над одним, ідеальний для сценаріїв, коли потрібно мати стек елементів або відображати один елемент у певний момент часу.

Приклад

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <!-- Фонова картинка -->
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/background_image"
        android:scaleType="centerCrop" />

    <!-- Основний контент (текст в центрі) -->
    <TextView
        android:id="@+id/mainText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Ласкаво просимо!"
        android:textSize="24sp"
        android:textColor="@android:color/white"
        android:textStyle="bold" />

    <!-- Завантаження (Loading) -->
    <ProgressBar
        android:id="@+id/loadingSpinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:visibility="gone" />
</FrameLayout>
package com.example.framelayoutdemo;

import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private ProgressBar loadingSpinner;
    private TextView mainText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_frame_layout);

        // Ініціалізація елементів
        loadingSpinner = findViewById(R.id.loadingSpinner);
        mainText = findViewById(R.id.mainText);

        // Симуляція завантаження
        showLoading(true);

        // Затримка для симуляції даних (3 секунди)
        new Handler().postDelayed(() -> {
            showLoading(false);
            mainText.setText("Дані успішно завантажені!");
        }, 3000);
    }

    /**
     * Метод для керування завантаженням
     *
     * @param isLoading якщо true - показує ProgressBar, ховає текст.
     */
    private void showLoading(boolean isLoading) {
        if (isLoading) {
            loadingSpinner.setVisibility(View.VISIBLE);
            mainText.setVisibility(View.GONE);
        } else {
            loadingSpinner.setVisibility(View.GONE);
            mainText.setVisibility(View.VISIBLE);
        }
    }
}

FrameLayout часто використовується у таких випадках:

  1. Екрани завантаження: відображення спінера поверх вмісту, поки відбувається завантаження.
  2. Картки з фоновими зображеннями: додавання тексту поверх зображення (наприклад, назва продукту).