0Pricing
Android Academy · Lezione

Fragment

Creare interfacce modulari con i Fragment. Imparare il ciclo di vita dei fragment, ViewBinding nei fragment, il passaggio degli argomenti, la gestione del back stack e la comunicazione tra fragment e Activity.

Fragment è una lezione Android Academy gratuita su CoddyKit. Questa è la lezione 6 di 7. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Android Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Android Academy include 7 lezioni in totale.

Che cosa sono i Fragment?

Un Fragment è un modulo dell'interfaccia utente riutilizzabile che vive all'interno di una Activity. Lo si può considerare una sotto-Activity con layout, ciclo di vita e logica propri.

Perché usare i Fragment?

  • Riutilizzare l'interfaccia in più Activity
  • Gestire layout diversi per telefoni e tablet
  • Creare flussi composti da più schermate senza usare più Activity
  • Funzionare naturalmente con Navigation Component

Ciclo di vita dei Fragment

I Fragment hanno un proprio ciclo di vita che si svolge parallelamente a quello dell'Activity. Callback principali:

  • onAttach — il Fragment viene collegato all'Activity
  • onCreate — il Fragment viene creato (la vista non è ancora disponibile)
  • onCreateView — esegue l'inflation del layout
  • onViewCreated — la vista è pronta; qui si configura l'interfaccia
  • onDestroyView — la vista viene distrutta (si eliminano i riferimenti alla vista)
  • onDetach — il Fragment viene scollegato

Creazione di un Fragment

Crei una classe che estenda Fragment ed esegua l'override di onCreateView per eseguire l'inflation del layout:

import androidx.fragment.app.Fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

class HomeFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_home, container, false)
    }
}

ViewBinding nei Fragment

Utilizzi ViewBinding nei Fragment, ma rilasci il binding in onDestroyView per evitare memory leak:

class HomeFragment : Fragment() {

    private var _binding: FragmentHomeBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.tvTitle.text = "Welcome!"
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null   // prevent memory leak
    }
}

XML del layout di un Fragment

Crei res/layout/fragment_home.xml proprio come un layout di Activity. La vista radice diventa la vista del Fragment:

<!-- res/layout/fragment_home.xml -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:text="Home" />

</LinearLayout>

Aggiunta di un Fragment a un'Activity

Esistono due modi per aggiungere un Fragment a un'Activity:

  • Statico (XML) — dichiararlo nel layout con il tag <fragment>. Rimane fisso durante l'esecuzione.
  • dinamico (codice) — utilizzare FragmentManager e le transazioni. Può essere sostituito durante l'esecuzione.
<!-- Static: in activity_main.xml -->
<fragment
    android:id="@+id/homeFragment"
    android:name="com.example.HomeFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Transazioni dinamiche dei Fragment

Utilizzi supportFragmentManager per aggiungere, sostituire o rimuovere Fragment durante l'esecuzione:

// In Activity:
class MainActivity : AppCompatActivity(R.layout.activity_main) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .add(R.id.fragmentContainer, HomeFragment())
                .commit()
        }
    }

    fun showDetail(id: Int) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.fragmentContainer, DetailFragment.newInstance(id))
            .addToBackStack(null)  // allow back navigation
            .commit()
    }
}

Passaggio di argomenti ai Fragment

Passi i dati tramite un Bundle usando il pattern factory con companion object. Non utilizzi mai un costruttore di Fragment con parametri: dopo le modifiche alla configurazione, Android ricrea i Fragment usando un costruttore senza argomenti:

class DetailFragment : Fragment() {

    companion object {
        private const val ARG_ID = "item_id"

        fun newInstance(itemId: Int): DetailFragment {
            return DetailFragment().apply {
                arguments = Bundle().apply {
                    putInt(ARG_ID, itemId)
                }
            }
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val itemId = requireArguments().getInt(ARG_ID)
        // use itemId to load data
    }
}

Comunicazione tra Fragment e Activity

Utilizzi una interface definita nel Fragment e implementata dall'Activity. Il Fragment ottiene un riferimento tramite onAttach:

class ListFragment : Fragment() {

    interface OnItemSelected {
        fun onItemSelected(id: Int)
    }

    private var listener: OnItemSelected? = null

    override fun onAttach(context: Context) {
        super.onAttach(context)
        listener = context as? OnItemSelected
    }

    private fun handleClick(id: Int) {
        listener?.onItemSelected(id)
    }

    override fun onDetach() {
        super.onDetach()
        listener = null
    }
}

Back stack

Quando chiama addToBackStack(null) in una transazione, premendo Indietro il Fragment viene estratto dallo stack:

  • Senza addToBackStack — Indietro chiude l'Activity
  • Con addToBackStack — Indietro torna al Fragment precedente
  • Utilizzi popBackStack() a livello programmatico per tornare indietro

Fragment in un contenitore

Il layout dell'Activity necessita solo di una vista contenitore, in genere un FrameLayout con un ID. Il Fragment riempie tale contenitore:

<!-- activity_main.xml -->
<FrameLayout
    android:id="@+id/fragmentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Verifica rapida

Perché non si devono mai passare argomenti al costruttore di un Fragment e si deve invece utilizzare un Bundle tramite una factory companion?

Riepilogo: Fragment

I Fragment sono i componenti fondamentali delle moderne interfacce utente Android:

  • Estenda Fragment ed esegua l'inflation del layout in onCreateView
  • Configuri l'interfaccia in onViewCreated
  • Rilasci ViewBinding in onDestroyView
  • Passi i dati tramite Bundle e una factory companion (newInstance)
  • Utilizzi addToBackStack per la navigazione all'indietro
  • Comunichi con l'Activity tramite un'interface

Prossimo argomento: richiedere durante l'esecuzione le autorizzazioni pericolose.

Domande Frequenti

La lezione «Fragment» è gratuita?

Sì — il testo completo di «Fragment» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Android Academy, passa a CoddyKit PRO. Il corso Android Academy include 7 lezioni in totale.

Cosa imparerò in «Fragment»?

Creare interfacce modulari con i Fragment. Imparare il ciclo di vita dei fragment, ViewBinding nei fragment, il passaggio degli argomenti, la gestione del back stack e la comunicazione tra fragment e… Eserciti Android Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Android Academy?

Non è richiesta alcuna esperienza precedente. Android Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 6 di 7.

Quanto tempo richiede la lezione «Fragment»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Android Academy?

Sì. Ogni lezione Android Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Struttura del progetto e manifest
  2. Activity e ciclo di vita
  3. Layout e viste
  4. Gestione dell'input dell'utente
  5. Intent e navigazione
  6. Fragment
  7. Autorizzazioni e richieste a runtime
← Torna a Android Academy