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 часто використовується у таких випадках:
- Екрани завантаження: відображення спінера поверх вмісту, поки відбувається завантаження.
- Картки з фоновими зображеннями: додавання тексту поверх зображення (наприклад, назва продукту).
