Что такое фрагменты?
Фрагменты позволяют создавать определённую область внутри приложения, в которую можно динамически помещать информацию. Представьте: есть 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.