Fragment è un componente UI riutilizzabile in Android che viene incorporato in un Activity e gestito tramite FragmentManager. Ogni frammento ha il proprio ciclo di vita, layout e stato. Fragment semplifica l'adattamento a diverse dimensioni dello schermo e il riutilizzo del codice. Leggi di più nella guida ufficiale di Google.
Punti chiave
Fragment è un componente modulare dell'interfaccia utente Android che rappresenta una parte dello schermo all'interno di un Activity. Fragment può gestire il proprio layout, gestire gli eventi del ciclo di vita e salvare il proprio stato. Grazie alla modularità, un frammento può essere utilizzato in diversi Activity e su diversi dispositivi.
L'API Fragment è apparsa in Android 3.0 (Honeycomb, API 11) nel 2011 per supportare i tablet. Prima di allora, gli sviluppatori dovevano creare Activity separati per telefono e tablet. Fragment ha permesso di assemblare uno schermo da blocchi indipendenti. Nel 2019, Google ha rilasciato la libreria Jetpack Fragment con retrocompatibilità fino all'API 4.
Secondo Google (2026), il 80% delle app su Google Play utilizza Fragment in qualche forma. La libreria Jetpack Fragment è stata scaricata oltre 10 miliardi di volte tramite Google Play Services. Fragment rimane un componente chiave dell'architettura Android anche nell'era di Jetpack Compose.
Il ciclo di vita di Fragment è più complesso di quello di Activity perché dipende dallo stato dell'Activity ospitante. Fragment attraversa gli stessi stati di Activity ma aggiunge i propri callback: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.
| Callback di Fragment | Equivalente in Activity | Scopo |
|---|---|---|
| onAttach | prima di onCreate | Fragment allegato all'Activity |
| onCreate | onCreate | Inizializzazione dati non UI |
| onCreateView | onCreate | Creazione del layout tramite inflater |
| onViewCreated | onCreate | Collegamento elementi UI dopo la creazione della view |
| onDestroyView | onDestroy | Rimozione della view, rilascio risorse UI |
| onDetach | onDestroy | Fragment scollegato dall'Activity |
La differenza principale del ciclo di vita di Fragment è l'invocazione di onCreateView e onDestroyView tra onCreate e onDestroy. Fragment può esistere senza UI (se onCreateView restituisce null). Dopo la ricreazione dell'Activity, FragmentManager ripristina automaticamente i frammenti.
FragmentManager è la classe centrale per gestire i frammenti in un Activity. Si occupa di aggiungere, rimuovere, sostituire frammenti, gestire la back stack e ripristinare lo stato. FragmentManager è disponibile tramite supportFragmentManager (AndroidX) o fragmentManager (vecchia API).
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Frammento non ancora aggiunto — creazione
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()
}
}Le transazioni FragmentTransaction sono atomiche. commit() programma l'esecuzione per il prossimo ciclo di Looper. Per l'esecuzione immediata usa commitNow(). addToBackStack(null) aggiunge la transazione alla back stack — il pulsante Indietro annullerà l'operazione.
Vediamo i metodi chiave del ciclo di vita di Fragment con un esempio in Kotlin. onCreateView crea un layout — a differenza di Activity, il metodo deve restituire una View. onViewCreated viene chiamato subito dopo, qui è sicuro trovare elementi per id. onDestroyView è l'ultimo momento per pulire i riferimenti alla 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("Dettagli")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}Il pattern View Binding con _binding/binding garantisce che dopo onDestroyView il riferimento al layout sia annullato. Accedere a binding dopo la distruzione della view causerà NullPointerException. Questo pattern è raccomandato da Google per tutti i frammenti.
Per il trasferimento dati tra frammenti, Android offre diversi meccanismi. Il più affidabile è un ViewModel condiviso tra frammenti dello stesso Activity. Fragment Result API è adatto per eventi una tantum. Gli argomenti Bundle sono per i dati durante la creazione di un frammento.
// ViewModel condiviso per due frammenti
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// Frammento A: invia evento tramite Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))
// Frammento B: riceve evento
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}Fragment Result API (aggiunto in Fragment 1.3.0) sostituisce i deprecati setTargetFragment/onActivityResult. L'API è type-safe, usa Bundle e non richiede la conoscenza del destinatario. Parent FragmentManager agisce da intermediario tra i frammenti.
La scelta tra Fragment e Activity dipende dall'architettura dell'applicazione. Fragment è obbligatorio per layout adattivi (telefono + tablet), per animazioni di transizione personalizzate e per usare Jetpack Navigation. Activity è preferibile per app semplici con uno o due schermi.
| Criterio | Fragment | Activity |
|---|---|---|
| Velocità di creazione | Più veloce (componente leggero) | Più lenta (processo di sistema) |
| Riutilizzabilità | Alta (un frammento in diversi Activity) | Bassa (ogni schermo ha il proprio Activity) |
| Animazione transizioni | Flessibile (FragmentTransaction) | Limitata (overridePendingTransition) |
| Conservazione alla rotazione | Automatica (il gestore ripristina) | Manuale (onSaveInstanceState) |
| Deep Links | Tramite Navigation Component | Supporto nativo tramite intent-filter |
L'approccio moderno per lavorare con Fragment è Jetpack Navigation Component, che sostituisce la gestione manuale di FragmentManager. La libreria fornisce NavGraph (grafo di navigazione XML), NavHostFragment e Safe Args per il trasferimento dati type-safe.
Jetpack Fragment library (androidx.fragment:fragment-ktx) include FragmentResult API, DialogFragment, BottomSheetDialogFragment e integrazione con componenti Lifecycle-aware. Dal 2026, Google raccomanda di usare Fragment solo tramite Jetpack Navigation, non direttamente.
<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="Elenco">
<action
android:id="@+id/action_list_to_detail"
app:destination="@+id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="Dettagli" />
</navigation>Domande frequenti
FragmentManager è una classe che gestisce le transazioni dei frammenti. Aggiunge, rimuove e sostituisce frammenti in un contenitore di Activity. FragmentManager ripristina lo stato dei frammenti durante la ricreazione dell'Activity e gestisce la back stack.
Fragment è una parte dell'UI all'interno di un Activity, non può esistere indipendentemente. Fragment sopravvive alla ricreazione dell'Activity durante la rotazione dello schermo. Activity è uno schermo completo con il proprio Lifecycle, Fragment dipende dal Lifecycle dell'Activity.
Fragment — quando uno schermo è composto da più blocchi indipendenti (schede, master-detail, adattamento tablet). Activity — quando uno schermo non ha blocchi ripetibili. Google raccomanda Single Activity + multipli Fragment.
Tre modi: tramite l'Activity genitore (un ViewModel condiviso), tramite Fragment Result API (setFragmentResult), tramite argomenti Bundle durante la creazione di un Fragment. ViewModel è il metodo preferito poiché i dati vengono preservati durante la ricreazione.
Fragment Transaction è un'operazione atomica che modifica l'insieme dei frammenti. FragmentManager.beginTransaction() apre una transazione in cui è possibile chiamare add, remove, replace, hide, show. Ogni transazione termina con commit() o commitNow().
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche