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'ActivityonCreate— il Fragment viene creato (la vista non è ancora disponibile)onCreateView— esegue l'inflation del layoutonViewCreated— la vista è pronta; qui si configura l'interfacciaonDestroyView— 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
FragmentManagere 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
Fragmented esegua l'inflation del layout inonCreateView - Configuri l'interfaccia in
onViewCreated - Rilasci ViewBinding in
onDestroyView - Passi i dati tramite
Bundlee una factory companion (newInstance) - Utilizzi
addToBackStackper 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
- Struttura del progetto e manifest
- Activity e ciclo di vita
- Layout e viste
- Gestione dell'input dell'utente
- Intent e navigazione
- Fragment
- Autorizzazioni e richieste a runtime