Un frammento rappresenta una parte modulare dell'interfaccia utente all'interno di un'attività. Un frammento ha il proprio ciclo di vita, riceve i propri eventi di input e puoi aggiungere o rimuovere frammenti mentre è in esecuzione l'attività contenitore.
Questo documento descrive come creare un frammento e includerlo in un'attività.
Configura l'ambiente
I frammenti richiedono una dipendenza dalla libreria Fragment AndroidX. Devi aggiungere il Repository Maven di Google al file settings.gradle
del tuo progetto per includere questa dipendenza.
Trendy
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Kotlin
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Per includere la libreria di frammenti AndroidX nel progetto, aggiungi le seguenti
dipendenze nel file build.gradle
dell'app:
trendy
dependencies { def fragment_version = "1.8.2" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" }
Kotlin
dependencies { val fragment_version = "1.8.2" // Java language implementation implementation("androidx.fragment:fragment:$fragment_version") // Kotlin implementation("androidx.fragment:fragment-ktx:$fragment_version") }
Crea una classe di frammenti
Per creare un frammento, estendi la classe AndroidX Fragment
e sostituisci i suoi metodi per inserire la logica dell'app, in modo simile a come creeresti una classe Activity
. Per creare un frammento minimo che definisca il proprio layout, fornisci la risorsa di layout del frammento al costruttore di base, come mostrato nell'esempio seguente:
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment)
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } }
La libreria Fragment fornisce inoltre classi base di frammenti più specializzate:
DialogFragment
- Mostra una finestra di dialogo mobile. L'utilizzo di questo corso per creare una finestra di dialogo è una buona alternativa all'utilizzo dei metodi helper delle finestre di dialogo nella classe
Activity
, poiché i frammenti gestiscono automaticamente la creazione e la pulizia diDialog
. Per ulteriori dettagli, consulta Visualizzare le finestre di dialogo conDialogFragment
. PreferenceFragmentCompat
- Visualizza una gerarchia di oggetti
Preference
sotto forma di elenco. Puoi usarePreferenceFragmentCompat
per creare una schermata delle impostazioni per la tua app.
Aggiungi un frammento a un'attività
In genere, il frammento deve essere incorporato in un elemento AndroidX FragmentActivity
per contribuire a una parte dell'interfaccia utente al layout di quell'attività. FragmentActivity
è la classe base per
AppCompatActivity
,
quindi, se stai già creando una sottoclasse di AppCompatActivity
per garantire la compatibilità
con le versioni precedenti nella tua app, non è necessario modificare la classe della
base di attività.
Puoi aggiungere il tuo frammento alla gerarchia delle visualizzazioni dell'attività definendo il frammento nel file di layout dell'attività oppure definendo un container dei frammenti nel file di layout dell'attività e aggiungendo poi in modo programmatico il frammento all'interno dell'attività. In entrambi i casi, devi aggiungere un elemento FragmentContainerView
che definisca la posizione in cui deve essere collocato il frammento all'interno della gerarchia delle visualizzazioni dell'attività. Ti consigliamo di utilizzare sempre un elemento FragmentContainerView
come container per i frammenti, poiché FragmentContainerView
include correzioni specifiche per frammenti che altri gruppi di visualizzazioni, come FrameLayout
, non forniscono.
Aggiungi un frammento tramite XML
Per aggiungere in modo dichiarativo un frammento al file XML del layout dell'attività, utilizza un elemento FragmentContainerView
.
Ecco un esempio di layout di attività contenente un singolo
FragmentContainerView
:
<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.ExampleFragment" />
L'attributo android:name
specifica il nome della classe di Fragment
da
verificare. Quando il layout dell'attività aumenta, viene creata un'istanza del frammento specificato, onInflate()
viene richiamato sul frammento appena creato e viene creato un FragmentTransaction
per aggiungere il frammento a FragmentManager
.
Aggiungi un frammento in modo programmatico
Per aggiungere in modo programmatico un frammento al layout dell'attività, il layout deve includere un FragmentContainerView
che funga da contenitore di frammenti, come mostrato nell'esempio seguente:
<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
A differenza dell'approccio XML, l'attributo android:name
non viene utilizzato
in FragmentContainerView
qui, quindi nessun frammento specifico viene
corrotto automaticamente. Viene invece utilizzato un elemento FragmentTransaction
per creare l'istanza di un frammento e aggiungerlo al layout dell'attività.
Mentre l'attività è in esecuzione, puoi effettuare transazioni sui frammenti, ad esempio aggiungere, rimuovere o sostituire un frammento. In FragmentActivity
, puoi ottenere un'istanza di FragmentManager
, che può essere utilizzata per creare un FragmentTransaction
. Quindi, puoi creare un'istanza del frammento all'interno del metodo onCreate()
dell'attività utilizzando FragmentTransaction.add()
, trasmettendo l'ID ViewGroup
del container nel layout e la classe di frammenti che vuoi aggiungere, quindi esegui il commit della transazione, come mostrato nell'esempio seguente:
Kotlin
class ExampleActivity : AppCompatActivity(R.layout.example_activity) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { supportFragmentManager.commit { setReorderingAllowed(true) add<ExampleFragment>(R.id.fragment_container_view) } } } }
Java
public class ExampleActivity extends AppCompatActivity { public ExampleActivity() { super(R.layout.example_activity); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.fragment_container_view, ExampleFragment.class, null) .commit(); } } }
Nell'esempio precedente, tieni presente che la transazione del frammento viene creata solo quando savedInstanceState
è null
. Questo serve a garantire che il frammento venga aggiunto
una sola volta, quando viene creata l'attività. Quando si verifica una modifica alla configurazione e l'attività viene ricreata, savedInstanceState
non è più null
e non è necessario aggiungere il frammento una seconda volta, poiché il frammento viene ripristinato automaticamente da savedInstanceState
.
Se il frammento richiede alcuni dati iniziali, puoi passare argomenti al frammento fornendo un Bundle
nella chiamata a FragmentTransaction.add()
, come mostrato di seguito:
Kotlin
class ExampleActivity : AppCompatActivity(R.layout.example_activity) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { val bundle = bundleOf("some_int" to 0) supportFragmentManager.commit { setReorderingAllowed(true) add<ExampleFragment>(R.id.fragment_container_view, args = bundle) } } } }
Java
public class ExampleActivity extends AppCompatActivity { public ExampleActivity() { super(R.layout.example_activity); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { Bundle bundle = new Bundle(); bundle.putInt("some_int", 0); getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.fragment_container_view, ExampleFragment.class, bundle) .commit(); } } }
Gli argomenti Bundle
possono quindi essere recuperati dall'interno del frammento chiamando
requireArguments()
.
È possibile utilizzare i metodi getter Bundle
appropriati per recuperare ogni argomento.
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val someInt = requireArguments().getInt("some_int") ... } }
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { int someInt = requireArguments().getInt("some_int"); ... } }
Vedi anche
Le transazioni relative ai frammenti e FragmentManager
sono trattati in maggiore dettaglio nella guida di gestione dei frammenti.