Fragment: cos'è, frammenti e FragmentManager in Android

Autore: IT Sectr Pubblicato: 2026-02-22 Tempo di lettura: 7 min

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 UI all'interno di un Activity con proprio ciclo di vita e layout
  • FragmentManager — una classe per gestire le transazioni dei frammenti e la back stack
  • FragmentTransaction — un'operazione atomica per aggiungere, sostituire o rimuovere frammenti
  • Jetpack Fragment — una libreria per la retrocompatibilità fino ad Android 1.6 (API 4)
  • ViewModel — un componente condiviso per lo scambio di dati tra frammenti in uno stesso Activity

Cos'è Fragment?

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.

Ciclo di vita di Fragment

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 FragmentEquivalente in ActivityScopo
onAttachprima di onCreateFragment allegato all'Activity
onCreateonCreateInizializzazione dati non UI
onCreateViewonCreateCreazione del layout tramite inflater
onViewCreatedonCreateCollegamento elementi UI dopo la creazione della view
onDestroyViewonDestroyRimozione della view, rilascio risorse UI
onDetachonDestroyFragment scollegato dall'Activity

Confronto del ciclo di vita di Fragment e 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 e transazioni

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).

kotlin
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.

Metodi del ciclo di vita di Fragment

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.

kotlin
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.

Trasferimento dati tra 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.

kotlin
// 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.

Fragment vs Activity: quando scegliere cosa

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.

CriterioFragmentActivity
Velocità di creazionePiù veloce (componente leggero)Più lenta (processo di sistema)
RiutilizzabilitàAlta (un frammento in diversi Activity)Bassa (ogni schermo ha il proprio Activity)
Animazione transizioniFlessibile (FragmentTransaction)Limitata (overridePendingTransition)
Conservazione alla rotazioneAutomatica (il gestore ripristina)Manuale (onSaveInstanceState)
Deep LinksTramite Navigation ComponentSupporto nativo tramite intent-filter

Jetpack Fragment e Jetpack Navigation

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.

xml

<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

Cos'è FragmentManager?

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.

In cosa Fragment differisce da Activity?

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.

Quando usare Fragment invece di 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.

Come trasferire dati tra 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.

Cos'è Fragment Transaction?

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

  • Fragment è un componente UI riutilizzabile all'interno di un Activity con proprio ciclo di vita, layout e stato
  • FragmentManager gestisce le transazioni dei frammenti e ripristina il loro stato alla ricreazione dell'Activity
  • FragmentTransaction è un'operazione atomica per aggiungere, sostituire, rimuovere e nascondere frammenti
  • Il ciclo di vita di Fragment include sei callback, da onAttach a onDetach, con un punto aggiuntivo onCreateView
  • ViewModel è il modo raccomandato per scambiare dati tra frammenti in uno stesso Activity
  • Fragment Result API fornisce il trasferimento type-safe di eventi una tantum tra frammenti

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.

Discuti il progetto

Leggi anche