Fragment — en återanvändbar UI-komponent i Android som bäddas in i Activity och hanteras via FragmentManager. Varje fragment har en egen livscykel, layout och tillstånd. Fragment förenklar anpassning till olika skärmstorlekar och återanvändning av kod. Läs mer i Googles officiella guide.
Huvudpunkter
Fragment — en modulär komponent i Android-gränssnittet som representerar en del av skärmen inuti Activity. Fragment kan hantera sin egen layout, bearbeta livscykelhändelser och spara sitt tillstånd. Tack vare modularitet kan ett fragment användas i olika Activities och på olika enheter.
Fragment API introducerades i Android 3.0 (Honeycomb, API 11) år 2011 för stöd av surfplattor. Innan dess var utvecklare tvungna att skapa separata Activities för telefon och surfplatta. Fragment möjliggjorde att bygga skärmen från oberoende block. 2019 släppte Google Jetpack Fragment-biblioteket med bakåtkompatibilitet till API 4.
Enligt Google-data (2026) använder 80% av apparna i Google Play Fragment i någon form. Jetpack Fragment-biblioteket har laddats ner över 10 miljarder gånger via Google Play Services. Fragment förblir en nyckelkomponent i Android-arkitekturen även i Jetpack Compose-eran.
Livscykeln för Fragment är mer komplex än för Activity eftersom den beror på värd-Activityns tillstånd. Fragment går igenom samma tillstånd som Activity men lägger till egna callbacks: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.
| Fragment callback | Motsvarar Activity | Syfte |
|---|---|---|
| onAttach | före onCreate | Fragment kopplat till Activity |
| onCreate | onCreate | Initiering av data som inte är UI-relaterade |
| onCreateView | onCreate | Skapa layout via inflater |
| onViewCreated | onCreate | Binda UI-element efter att view har skapats |
| onDestroyView | onDestroy | Ta bort view, frigöra UI-resurser |
| onDetach | onDestroy | Fragment frånkopplat från Activity |
Huvudskillnaden i Fragment-livscykeln — anrop av onCreateView och onDestroyView mellan onCreate och onDestroy. Fragment kan existera utan UI (om onCreateView returnerar null). Efter återskapande av Activity återställer FragmentManager fragmenten automatiskt.
FragmentManager — den centrala klassen för hantering av fragment i Activity. Den ansvarar för att lägga till, ta bort, ersätta fragment, hantera bakåtstacken och återställa tillstånd. FragmentManager är tillgänglig via supportFragmentManager (AndroidX) eller fragmentManager (gammalt API).
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Om fragmentet inte har lagts till än — skapar vi det
if (savedInstanceState == null) {
val transaction = this.supportFragmentManager
.beginTransaction()
transaction.add(R.id.fragment_container, ListFragment())
transaction.addToBackStack(null)
transaction.commit()
}
}
fun replaceFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit()
}
}Transaktioner i FragmentTransaction — är atomära. commit() schemalägger exekvering till nästa Looper-cykel. För omedelbar exekvering, använd commitNow(). addToBackStack(null) lägger till transaktionen i bakåtstacken — «Tillbaka»-knappen ångrar operationen.
Låt oss titta på nyckelmetoderna i Fragment-livscykeln med ett exempel i Kotlin. onCreateView skapar layouten — till skillnad från Activity måste metoden returnera View. onViewCreated anropas direkt efteråt, här är det säkert att hitta element efter id. onDestroyView — sista tillfället att rensa referenser till view.
class DetailFragment : Fragment() {
private var _binding: FragmentDetailBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentDetailBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.textTitle.setText("Detaljer")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}View Binding-mönstret med _binding/binding garanterar att referensen till layout nollställs efter onDestroyView. Åtkomst till binding efter att view förstörts orsakar NullPointerException. Detta mönster rekommenderas av Google för alla fragment.
För dataöverföring mellan fragment erbjuder Android flera mekanismer. Den mest pålitliga — delad ViewModel, som delas mellan fragment i samma Activity. Fragment Result API passar för engångshändelser. Bundle-argument — för data när fragment skapas.
// Delad ViewModel för två fragment
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// Fragment A: skickar händelse via Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))
// Fragment B: tar emot händelsen
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}Fragment Result API (tillagt i Fragment 1.3.0) ersätter föråldrade setTargetFragment/onActivityResult. API:t är typsäkert, använder Bundle och kräver inte kännedom om mottagaren. Parent FragmentManager fungerar som medlare mellan fragment.
Valet mellan Fragment och Activity beror på applikationsarkitekturen. Fragment är obligatoriskt för adaptiva layouter (telefon + surfplatta), för anpassade övergångsanimationer och för användning av Jetpack Navigation. Activity är att föredra för enkla appar med en eller två skärmar.
| Kriterium | Fragment | Activity |
|---|---|---|
| Skapandefart | Snabbare (lätt komponent) | Långsammare (systemprocess) |
| Återanvändning | Hög (ett fragment i olika Activities) | Låg (varje skärm — egen Activity) |
| Övergångsanimation | Flexibel (FragmentTransaction) | Begränsad (overridePendingTransition) |
| Spara vid rotation | Automatiskt (hanteraren återställer) | Manuellt (onSaveInstanceState) |
| Deep Links | Via Navigation Component | Nativt stöd via intent-filter |
Det moderna sättet att arbeta med Fragment — Jetpack Navigation Component, som ersätter manuell hantering av FragmentManager. Biblioteket tillhandahåller NavGraph (XML-navigationsgraf), NavHostFragment och Safe Args för typsäker dataöverföring.
Jetpack Fragment-biblioteket (androidx.fragment:fragment-ktx) inkluderar FragmentResult API, DialogFragment, BottomSheetDialogFragment och integration med Lifecycle-aware komponenter. Från 2026 rekommenderar Google att använda Fragment endast via Jetpack Navigation, inte direkt.
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@+id/listFragment">
<fragment
android:id="@+id/listFragment"
android:name=".ListFragment"
android:label="Lista">
<action
android:id="@+id/action_list_to_detail"
app:destination="@+id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="Detaljer" />
</navigation>Vanliga frågor
FragmentManager — klass som hanterar fragmenttransaktioner. Den lägger till, tar bort, ersätter fragment i Activity-containern. FragmentManager återställer fragmentens tillstånd vid återskapande av Activity och hanterar bakåtstacken.
Fragment — del av UI inuti Activity, kan inte existera självständigt. Fragment överlever återskapande av Activity vid skärmrotation. Activity — fullständig skärm med egen Lifecycle, Fragment beror på Activtiyns Lifecycle.
Fragment — när skärmen består av flera oberoende block (flikar, master-detail, anpassning för surfplatta). Activity — när skärmen inte har upprepande block. Google rekommenderar Single Activity + många Fragment.
Tre sätt: via förälder-Activity (delad ViewModel), via Fragment Result API (setFragmentResult), via Bundle-argument när Fragment skapas. ViewModel — föredraget sätt, eftersom data bevaras vid återskapande.
Fragment Transaction — atomär operation för att ändra uppsättningen fragment. FragmentManager.beginTransaction() öppnar en transaktion där add, remove, replace, hide, show kan anropas. Varje transaktion avslutas med commit() eller commitNow().
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också