Crea un frammento

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.6.2"

    // Java language implementation
    implementation "androidx.fragment:fragment:$fragment_version"
    // Kotlin
    implementation "androidx.fragment:fragment-ktx:$fragment_version"
}

Kotlin

dependencies {
    val fragment_version = "1.6.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 di Dialog. Per ulteriori dettagli, consulta Visualizzare le finestre di dialogo con DialogFragment.
PreferenceFragmentCompat
Visualizza una gerarchia di oggetti Preference sotto forma di elenco. Puoi usare PreferenceFragmentCompat 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.