Crea un frammento

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 di Dialog. Consulta la sezione Visualizzazione delle finestre di dialogo con DialogFragment per maggiori dettagli.
PreferenceFragmentCompat
Mostra una gerarchia di Preference come oggetto dall'elenco di lettura. Puoi utilizzare PreferenceFragmentCompat 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.