Un frammento rappresenta una parte modulare dell'utente a riga di comando all'interno di un'attività. Un frammento ha il suo ciclo di vita, riceve il suo eventi di input ed è possibile aggiungere o rimuovere frammenti mentre è in corso l'attività.
Questo documento descrive come creare un frammento e includerlo in un'attività.
Configura l'ambiente
I frammenti richiedono una dipendenza
Libreria di frammenti AndroidX. Devi
aggiungi il Repository Maven di Google
al file settings.gradle
del progetto per includere questa dipendenza.
Alla moda
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 AndroidX Fragment nel tuo progetto, aggiungi quanto segue
di dipendenze nel file build.gradle
dell'app:
Alla moda
dependencies { def fragment_version = "1.8.3" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" }
Kotlin
dependencies { val fragment_version = "1.8.3" // Java language implementation implementation("androidx.fragment:fragment:$fragment_version") // Kotlin implementation("androidx.fragment:fragment-ktx:$fragment_version") }
Crea una classe fragment
Per creare un frammento, estendi AndroidX
Classe Fragment
e override
i suoi metodi per inserire la logica dell'app, in modo simile a come creeresti
un corso Activity
. Per creare un'immagine minima
che definisce 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 anche classi base dei frammenti più specializzate:
DialogFragment
- Mostra una finestra di dialogo mobile. Usare questo corso per creare un dialogo è un'ottima cosa
un'alternativa all'utilizzo dei metodi di aiuto delle finestre di dialogo
Classe
Activity
, come frammenti gestirà automaticamente la creazione e la pulizia diDialog
. Consulta la sezione Visualizzazione delle finestre di dialogo conDialogFragment
per maggiori dettagli. PreferenceFragmentCompat
- Mostra una gerarchia di
Preference
come oggetto dall'elenco di lettura. Puoi utilizzarePreferenceFragmentCompat
per crea una schermata delle impostazioni per la tua app.
Aggiungi un frammento a un'attività
In genere, il frammento deve essere incorporato in un file AndroidX
Da FragmentActivity
a
contribuiscono con una parte dell'UI al layout di quell'attività. FragmentActivity
è la classe base per
AppCompatActivity
,
quindi se stai già creando sottoclassi di AppCompatActivity
per fornire una
compatibilità nella tua app, non devi modificare le impostazioni
e la classe base.
Puoi aggiungere il frammento alla gerarchia delle visualizzazioni dell'attività
definendo il frammento nel file di layout della tua attività o definendo una
del frammento nel file di layout dell'attività e poi
aggiungendo in modo programmatico il frammento dalla tua attività. In entrambi i casi, è necessario
per aggiungere un
FragmentContainerView
che definisce la posizione in cui deve essere posizionato il frammento all'interno
la gerarchia delle visualizzazioni dell'attività. Ti consigliamo vivamente di utilizzare sempre
FragmentContainerView
come container per i frammenti, come
FragmentContainerView
include correzioni specifiche per i frammenti
gruppi di visualizzazioni come FrameLayout
non forniscono.
Aggiungi un frammento tramite XML
Per aggiungere in modo dichiarativo un frammento al file XML del layout delle 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
in
creare un'istanza. Quando il layout dell'attività è gonfiato, il frammento specificato
viene creata un'istanza,
onInflate()
viene richiamata sul frammento appena creato e un FragmentTransaction
per aggiungere il frammento a FragmentManager
.
Aggiungi un frammento in modo programmatico
Per aggiungere in modo programmatico un frammento al layout della tua attività, il layout
dovrebbe includere un elemento FragmentContainerView
da utilizzare come container 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 nella
FragmentContainerView
qui, quindi nessun frammento specifico viene automaticamente
creata un'istanza. Invece, un
FragmentTransaction
viene utilizzato per creare un'istanza di un frammento e aggiungerlo al layout dell'attività.
Mentre l'attività è in esecuzione, puoi effettuare transazioni frammentarie come
aggiunta, rimozione o sostituzione di un frammento. In FragmentActivity
, puoi
ottenere un'istanza
FragmentManager
, che
può essere utilizzato per creare un FragmentTransaction
. Quindi, puoi creare un'istanza
all'interno del metodo onCreate()
dell'attività utilizzando
FragmentTransaction.add()
,
passando l'ID ViewGroup
del container nel layout e il frammento
che desideri aggiungere ed 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, nota che la transazione con frammento viene creata solo
quando savedInstanceState
è null
. Questo serve a garantire che il frammento
viene aggiunto una sola volta, al momento della prima creazione dell'attività. Quando
una modifica alla configurazione e l'attività viene ricreata,
savedInstanceState
non è più null
e il frammento non ha bisogno
da aggiungere 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
chiamata
requireArguments()
,
e si possono usare 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 frammentarie e FragmentManager
sono trattate in modo più dettagliato
nella guida alla gestione dei frammenti.