Android Studio: Фрагменты для начинающих

Что такое фрагменты?

Фрагменты позволяют создавать определённую область внутри приложения, в которую можно динамически помещать информацию. Представьте: есть Activity (страница), на которой создаётся фрагмент. В этот фрагмент можно добавлять новую информацию во время работы программы, без перехода на новые страницы. Пользователь видит новую информацию на той же странице, внутри фрагмента.

Например, в приложении магазина IKEA товары могут отображаться списком или карточками. Если нужно показать новый список товаров, можно, конечно, создать новую Activity, но это неэффективно. Гораздо логичнее создать одну Activity и поместить в неё фрагмент, который будет отображать товары. При переходе на другие страницы (новые списки товаров) содержимое фрагмента будет заменяться, оставаясь на той же Activity. Это удобно как для разработчика (весь код в одном месте), так и для пользователя (быстрая, плавная подгрузка информации).

Подготовка Activity

Для наглядности добавим в основную Activity несколько объектов.

Добавим:

  • FloatingActionButton: Кнопка (например, для удаления элементов из корзины, используем картинку «мусорного ведра»). Расположим её внизу справа с отступами по 20 пикселей. Добавим contentDescription в код (например, "@string/etname"), чтобы избавиться от предупреждений.
  • RatingBar: Объект для выставления рейтинга. Добавим отступ сверху в 50 пикселей.
  • LinearLayout: Внутри него разместим две кнопки для загрузки разного контента в фрагмент. Добавим отступ сверху в 130 пикселей. Для layout_height используем wrap_content. Кнопкам зададим подписи «Фрагмент 1» и «Фрагмент 2», а также горизонтальные отступы по 20 пикселей.

Создание фрагментов

Создадим два новых фрагмента: FirstFragment и SecondFragment. Выбираем «New» -> «Fragment» -> «Fragment (Blank)». Удалим лишний код, оставив только метод onCreateView(), где указывается файл дизайна. Также удалим предустановленную текстовую надпись.

Добавим в FirstFragment:

  • SeekBar: Слайдер. Растянем его на всю ширину.

Добавим в SecondFragment:

  • Switch: Переключатель. Добавим текст «Нажми на меня». Увеличим размер переключателя при необходимости. Добавим фоновый цвет (например, #700 для SecondFragment и #AAAAAA для FirstFragment).

Добавление FrameLayout и взаимодействие с фрагментами

В layout основной Activity добавим FrameLayout для размещения фрагментов. Привяжем его к LinearLayout с помощью ConstraintLayout. Укажем отступы: по 10 пикселей по бокам и 90 пикселей снизу. Зададим ID primeLayout. Кнопкам также зададим ID: buttonFragment1 и buttonFragment2.

В коде Activity создадим поля для ссылок на кнопки и FrameLayout:

Button buttonFragment1;
Button buttonFragment2;
FrameLayout primeLayout;

Найдём эти элементы по ID:

buttonFragment1 = findViewById(R.id.buttonFragment1);
buttonFragment2 = findViewById(R.id.buttonFragment2);
primeLayout = findViewById(R.id.primeLayout);

При запуске проекта загрузим FirstFragment. Создадим объект FirstFragment и загрузим его с помощью FragmentTransaction:

FirstFragment firstFragment = new FirstFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.primeLayout, firstFragment).commit();

Добавим обработчики кликов для кнопок:

buttonFragment1.setOnClickListener(view -> setNewFragment(firstFragment));
buttonFragment2.setOnClickListener(view -> setNewFragment(new SecondFragment()));

Создадим метод setNewFragment(), который будет принимать фрагмент в качестве параметра и заменять содержимое FrameLayout:

private void setNewFragment(Fragment fragment) {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.primeLayout, fragment).addToBackStack(null).commit();
}

Метод addToBackStack(null) позволяет использовать кнопку «назад». Вместо addToBackStack(null) можно использовать метод replace(), который заменяет фрагмент, не добавляя его в стек.

Мы создали приложение с одной Activity, но с динамически меняющимся содержимым. Использование фрагментов позволило избежать создания множества Activity, упростив разработку и повысив удобство для пользователя. Не забывайте использовать метод replace() вместо add() для экономии памяти, и не забывайте вызывать метод commit() у FragmentTransaction.

Что будем искать? Например,программа