Характеристика | Activity | Fragment |
---|---|---|
Назначение | Полноценный экран приложения | Модульная часть UI |
Жизненный цикл | Независимый | Зависит от родительской Activity |
Стек навигации | Управляется системой (Back Stack) | Управляется FragmentManager |
Многопоточность | Имеет собственный UI-поток | Использует UI-поток Activity |
Ресурсы | Требует больше памяти | Более легковесный |
Переиспользование | Сложно использовать повторно | Создан для повторного использования |
Back Stack | Системный стек Activity | Собственный стек FragmentManager |
С появлением планшетов (2011) потребовался механизм для:
Пример 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>
Пример универсального фрагмента:
class NavigationFragment : Fragment() {
// Логика навигации может использоваться в разных Activity
}
supportFragmentManager.beginTransaction()
.replace(R.id.container, MyFragment())
.addToBackStack(null)
.commit()
Сравнение методов:
// Activity
override fun onCreate(savedInstanceState: Bundle?)
// Fragment
override fun onAttach(context: Context)
override fun onCreateView(inflater: LayoutInflater, ...)
override fun onViewCreated(view: View, ...)
setContentView()
устанавливает корневую ViewonCreateView()
возвращает View, которая добавляется в контейнер ActivitystartActivity()
FragmentManager
Основные отличия:
Причины создания:
Когда использовать:
Пример современного подхода (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()
}
}
}