Для чего используют механизм фрагментов?android-58

Фрагменты (Fragments) — это компоненты Android, представляющие собой модульные части UI и логики, которые можно комбинировать в рамках одной Activity. Они были введены в Android 3.0 (API 11) для решения ключевых задач, связанных с гибкостью, адаптивностью и повторным использованием кода.


Основные причины использования фрагментов

1. Адаптация к разным размерам экранов

Фрагменты позволяют создавать responsive-интерфейсы, которые динамически подстраиваются под:

  • Планшеты: Отображение нескольких фрагментов одновременно (например, список и детали в Master-Detail).
  • Смартфоны: Показ одного фрагмента на весь экран с навигацией между ними.

Пример компоновки для планшета:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <fragment
        android:id="@+id/listFragment"
        android:name="com.example.ListFragment"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"/>
    <fragment
        android:id="@+id/detailFragment"
        android:name="com.example.DetailFragment"
        android:layout_width="0dp"
        android:layout_weight="2"
        android:layout_height="match_parent"/>
</LinearLayout>

2. Модульность и повторное использование

  • UI-компоненты: Фрагменты инкапсулируют логику и разметку (например, панель навигации, форму ввода).
  • Сценарии: Один фрагмент можно использовать в разных Activity без дублирования кода.

Пример фрагмента для навигации:

class NavigationFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        return inflater.inflate(R.layout.fragment_navigation, container, false)
    }

    fun onButtonClick() {
        // Общая логика для всех Activity
    }
}

3. Управление жизненным циклом

Фрагменты имеют собственный жизненный цикл (onCreate, onStart, onResume и т.д.), что позволяет:

  • Контролировать ресурсы (например, подписки на данные).
  • Сохранять состояние при повороте экрана через onSaveInstanceState.

4. Навигация и транзакции

  • Динамическая замена: Фрагменты можно добавлять/удалять/заменять в runtime с помощью FragmentManager.
  • Back Stack: Поддержка возврата через addToBackStack().

Пример транзакции:

supportFragmentManager.beginTransaction()
    .replace(R.id.container, DetailFragment())
    .addToBackStack("detail")
    .commit()

5. Архитектурные паттерны

  • MVVM/Clean Architecture: Фрагменты выступают как View, делегируя логику ViewModel.
  • Single Activity: Современные подходы (например, Jetpack Navigation) используют одно Activity с множеством фрагментов.

Резюмируем

Фрагменты решают следующие задачи:

  1. Адаптивный UI — разметка для разных устройств.
  2. Модульность — переиспользование компонентов.
  3. Жизненный цикл — управление ресурсами.
  4. Динамическая навигация — транзакции и back stack.
  5. Архитектура — разделение ответственности.

Пример современного подхода (Jetpack Navigation):

// Навигация между фрагментами через граф
findNavController().navigate(R.id.action_list_to_detail)