Чем отличается Fragment от Activity? Зачем выдумали Fragment?android-59

Основные различия между Fragment и Activity

Характеристика Activity Fragment
НазначениеПолноценный экран приложенияМодульная часть UI
Жизненный циклНезависимыйЗависит от родительской Activity
Стек навигацииУправляется системой (Back Stack)Управляется FragmentManager
МногопоточностьИмеет собственный UI-потокИспользует UI-поток Activity
РесурсыТребует больше памятиБолее легковесный
ПереиспользованиеСложно использовать повторноСоздан для повторного использования
Back StackСистемный стек ActivityСобственный стек FragmentManager


Причины появления Fragment

1. Адаптация к разным формам устройств

С появлением планшетов (2011) потребовался механизм для:

  • Отображения нескольких UI-компонентов на одном экране (например, список + детали)
  • Динамической перекомпоновки интерфейса при повороте/изменении размера

Пример Master-Detail для планшета:

<!-- activity_main.xml (планшет) -->
<LinearLayout
    android:orientation="horizontal">
    <fragment
        android:id="@+id/listFragment"
        android:layout_width="400dp"/>
    <fragment
        android:id="@+id/detailFragment"
        android:layout_width="match_parent"/>
</LinearLayout>

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

  • Возможность создавать независимые UI-компоненты
  • Один фрагмент можно использовать в разных Activity

Пример универсального фрагмента:

class NavigationFragment : Fragment() {
    // Логика навигации может использоваться в разных Activity
}

3. Гибкое управление UI

  • Динамическая замена частей интерфейса без пересоздания Activity
  • Анимации переходов между фрагментами
  • Управление через FragmentTransaction:
supportFragmentManager.beginTransaction()
    .replace(R.id.container, MyFragment())
    .addToBackStack(null)
    .commit()

4. Современные архитектурные подходы

  • Single Activity Architecture (Jetpack Navigation)
  • Лучшая совместимость с ViewModel и LiveData

Ключевые технические отличия

1. Жизненный цикл

  • Activity: Полностью независим
  • Fragment: Зависит от родительской Activity + собственный View Lifecycle

Сравнение методов:

// Activity
override fun onCreate(savedInstanceState: Bundle?)

// Fragment
override fun onAttach(context: Context)
override fun onCreateView(inflater: LayoutInflater, ...)
override fun onViewCreated(view: View, ...)

2. Работа с View

  • Activity: setContentView() устанавливает корневую View
  • Fragment: onCreateView() возвращает View, которая добавляется в контейнер Activity

3. Навигация

  • Activity: Запуск через startActivity()
  • Fragment: Управление через FragmentManager

Проблемы, которые решают Fragment

  1. Дублирование кода при создании похожих экранов
  2. Сложность адаптации UI для разных устройств
  3. Производительность: Пересоздание всей Activity дороже чем замена Fragment
  4. Гибкость интерфейсов: Возможность создавать динамические UI

Резюмируем

  1. Основные отличия:

    • Fragment это часть UI, Activity - целый экран
    • Fragment зависит от Activity
    • Fragment легче и гибче
  2. Причины создания:

    • Поддержка планшетов
    • Модульность и повторное использование
    • Динамические интерфейсы
    • Современные архитектурные подходы
  3. Когда использовать:

    • Activity: Главные экраны, точки входа
    • Fragment: Повторяемые компоненты, адаптивные интерфейсы

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

// MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Начальная загрузка фрагмента
        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .replace(R.id.container, HomeFragment())
                .commit()
        }
    }
}