Mit der AppBar arbeiten

Über die obere App-Leiste eine einheitliche Position oben im App-Fenster für die Anzeige Informationen und Aktionen aus dem aktuellen Bildschirm.

<ph type="x-smartling-placeholder">
</ph> Beispiel für die obere App-Leiste
Abbildung 1: Beispiel für eine obere App-Leiste

Die Inhaberschaft der App-Leiste hängt von den Anforderungen Ihrer App ab. Wann? mithilfe von Fragmenten lässt sich die App-Leiste ActionBar, die diesem gehören durch die Host-Aktivität oder eine Symbolleiste im Layout Ihres Fragments.

Wenn für alle Bildschirme dieselbe App-Leiste verwendet wird, die sich immer oben befindet sich über die gesamte Bildschirmbreite erstreckt, verwenden Sie ein Aktionsleiste, die von der Aktivität gehostet wird. Die Verwendung von Design-App-Leisten trägt dazu bei, ein einheitliches Aussehen haben, und bietet die Möglichkeit zum Hosten von Optionsmenüs und einer Schaltfläche „Nach oben“.

Verwenden Sie eine vom Fragment gehostete Symbolleiste, wenn Sie mehr Kontrolle über die Größe, Platzierung und Animation der App-Leiste über mehrere Bildschirmen. Sie benötigen beispielsweise eine ausklappbare App-Leiste oder eine füllt nur die halbe Breite des Bildschirms und ist vertikal zentriert.

Unterschiedliche Situationen erfordern unterschiedliche Ansätze, z. B. das Aufblasen der Luft. und auf Nutzerinteraktionen reagieren. Das Verständnis der verschiedenen und die beste Methode für Ihre App zu finden, sparen Sie Zeit um sicherzustellen, dass deine App ordnungsgemäß funktioniert.

Die Beispiele in diesem Thema beziehen sich auf ein ExampleFragment, das ein bearbeitbares Profil zu erstellen. Durch das Fragment wird Folgendes aufgebläht: XML-definiertes Menü in der App-Leiste:

<!-- sample_menu.xml -->
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_settings"
        android:icon="@drawable/ic_settings"
        android:title="@string/settings"
        app:showAsAction="ifRoom"/>
    <item
        android:id="@+id/action_done"
        android:icon="@drawable/ic_done"
        android:title="@string/done"
        app:showAsAction="ifRoom|withText"/>

</menu>

Das Menü enthält zwei Optionen: eine für die Navigation zu einem Profilbildschirm. und eine zum Speichern der Profiländerungen.

Leiste mit Aktivitäts-Apps

Die App-Leiste gehört meistens zur Hostaktivität. Wenn die App gehört zu einer Aktivität, können Fragmente mit der App-Leiste interagieren durch Überschreiben von Framework-Methoden, die während der Fragmenterstellung aufgerufen werden.

Mit Aktivität registrieren

Sie müssen das System darüber informieren, dass Ihr App-Leistenfragment verwendet wird. der Bevölkerung des Optionsmenüs. Rufen Sie dazu setHasOptionsMenu(true) in der Methode onCreate(Bundle) des Fragments ein, wie im Folgenden gezeigt: Beispiel:

Kotlin

class ExampleFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }
}

Java

public class ExampleFragment extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }
}

setHasOptionsMenu(true) teilt dem System mit, dass Ihr Fragment möchte menübezogene Rückrufe erhalten. Wenn eine menübezogene genau wie ein Klick, erfolgt die Ereignisbehandlung erst für die Aktivität aufgerufen, bevor sie für das Fragment aufgerufen wird.

Verlassen Sie sich jedoch nicht auf diese Reihenfolge in Ihrer Anwendungslogik. Wenn dieselbe Bei der Aktivität werden mehrere Fragmente gehostet. Jedes Fragment kann ein Menü bereitstellen. Optionen. In diesem Fall hängt die Callback-Reihenfolge von der Reihenfolge dem die Fragmente hinzugefügt werden.

Menü erweitern

Um Ihr Menü mit dem Optionsmenü der App-Leiste zusammenzuführen, überschreiben Sie onCreateOptionsMenu() in Ihrem Fragment. Diese Methode empfängt das aktuelle App-Leistenmenü und MenuInflater als Parameter. Verwenden Sie den Menü-Inflater, um eine Instanz des Menüs Ihres Fragments zu erstellen, und mit dem aktuellen Menü zusammenführen, wie im folgenden Beispiel gezeigt:

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater.inflate(R.menu.sample_menu, menu)
    }
}

Java

public class ExampleFragment extends Fragment {
    ...
    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
       inflater.inflate(R.menu.sample_menu, menu);
    }
}

Abbildung 2 zeigt das aktualisierte Menü.

<ph type="x-smartling-placeholder">
</ph> Das Optionsmenü enthält jetzt Ihr Menüfragment.
Abbildung 2: Das Optionsmenü enthält jetzt Ihr Menü Fragment.

Click-Events verarbeiten

Jede Aktivität und jedes Fragment im Optionsmenü kann auf Berührungen reagieren. Das Fragment onOptionsItemSelected() empfängt den ausgewählten Menüpunkt als Parameter und gibt einen booleschen Wert um anzuzeigen, ob die Berührung konsumiert wird. Sobald ein Aktivität oder Fragment gibt true von onOptionsItemSelected() zurück, keine andere teilnehmende Fragmente erhalten den Callback.

Verwenden Sie in der Implementierung von onOptionsItemSelected() ein switch-Element -Anweisung zum itemId des Menüpunkts. Wenn das ausgewählte Element Gehörst du dir, reagiere entsprechend mit der Berührung und gebe true zurück, um anzuzeigen, dass das Click-Event verarbeitet wird. Wenn das ausgewählte Element nicht Ihres erstellen, rufen Sie die super-Implementierung auf. Standardmäßig ist die super wird false zurückgegeben, damit die Menüverarbeitung fortgesetzt werden kann.

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.action_settings -> {
                // Navigate to settings screen.
                true
            }
            R.id.action_done -> {
                // Save profile changes.
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }
}

Java

public class ExampleFragment extends Fragment {
    ...
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_settings:  {
                // Navigate to settings screen.
                return true;
            }
            case R.id.action_done: {
                // Save profile changes.
                return true;
            }
            default:
                return super.onOptionsItemSelected(item);
        }

    }

}

Menü dynamisch anpassen

Platzieren Sie die Logik zum Ausblenden oder Einblenden einer Schaltfläche oder zum Ändern des Symbols in onPrepareOptionsMenu() Diese Methode wird direkt vor der Anzeige des Menüs aufgerufen.

Um auf das vorherige Beispiel zurückzukommen: Die Schaltfläche Speichern sollte nun sind erst sichtbar, wenn der Nutzer mit der Bearbeitung beginnt. Danach sollte sie wieder ausgeblendet werden. die der Nutzer speichert. Durch Hinzufügen dieser Logik zu onPrepareOptionsMenu() wird das Menü korrekt angezeigt:

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onPrepareOptionsMenu(menu: Menu){
        super.onPrepareOptionsMenu(menu)
        val item = menu.findItem(R.id.action_done)
        item.isVisible = isEditing
    }
}

Java

public class ExampleFragment extends Fragment {
    ...
    @Override
    public void onPrepareOptionsMenu(@NonNull Menu menu) {
        super.onPrepareOptionsMenu(menu);
        MenuItem item = menu.findItem(R.id.action_done);
        item.setVisible(isEditing);
    }
}

Wenn Sie das Menü aktualisieren müssen, beispielsweise wenn Nutzende die Schaltfläche Bearbeiten, um die Profilinformationen zu bearbeiten, rufen Sie invalidateOptionsMenu() für die Hostaktivität, um anzufordern, dass das System onCreateOptionsMenu() aufruft. Nach der Entwertung können Sie die Aktualisierungen in onCreateOptionsMenu() vornehmen. Einmal Das Menü wird aufgebläht, das System ruft onPrepareOptionsMenu() auf und aktualisiert um den aktuellen Status des Fragments widerzuspiegeln.

Kotlin

class ExampleFragment : Fragment() {
    ...
    fun updateOptionsMenu() {
        isEditing = !isEditing
        requireActivity().invalidateOptionsMenu()
    }
}

Java

public class ExampleFragment extends Fragment {
    ...
    public void updateOptionsMenu() {
        isEditing = !isEditing;
        requireActivity().invalidateOptionsMenu();
    }
}

App-Leiste, die einem Fragment gehört

Wenn die meisten Bildschirme Ihrer App keine App-Leiste benötigen andere App-Leiste benötigen, können Sie eine Toolbar zu Ihrem Fragment-Layout. Sie können jedoch Toolbar an einer beliebigen Stelle Ansichtshierarchie eines Fragments bleibt es in der Regel ganz oben auf dem Bildschirm. Um das Toolbar in deinem Fragment zu verwenden, gib eine ID und wie bei jedem anderen Objekt in Ihrem Fragment, Ansicht. Sie können die Symbolleiste auch mit CoordinatorLayout Verhaltensweisen.

<androidx.appcompat.widget.Toolbar
    android:id="@+id/myToolbar"
    ... />

Wenn Sie eine fragmentierte App-Leiste verwenden, empfiehlt Google die Verwendung des Toolbar APIs direkt verwenden. Nicht verwenden setSupportActionBar() und Fragment-Menü-APIs, die nur für aktivitätseigene App-Leisten geeignet sind.

Menü erweitern

Die Convenience-Methode Toolbar inflateMenu(int) verwendet die ID eines Menüressource als Parameter verwendet. Um eine XML-Menüressource in in der Symbolleiste das resId an diese Methode übergeben, wie im Folgenden gezeigt: Beispiel:

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        ...
        viewBinding.myToolbar.inflateMenu(R.menu.sample_menu)
    }
}

Java

public class ExampleFragment extends Fragment {
    ...
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        ...
        viewBinding.myToolbar.inflateMenu(R.menu.sample_menu);
    }

}

Um eine weitere XML-Menüressource inflüssig zu machen, rufen Sie die -Methode erneut mit dem resId des neuen Menüs. Die neuen Menüpunkte werden zum Menü hinzugefügt und werden die vorhandenen Menüpunkte weder geändert noch entfernt.

Wenn du den vorhandenen Menüsatz ersetzen möchtest, lösche das Menü vor dem inflateMenu(int) mit der neuen Menü-ID aufrufen, wie unten gezeigt Beispiel:

Kotlin

class ExampleFragment : Fragment() {
    ...
    fun clearToolbarMenu() {
        viewBinding.myToolbar.menu.clear()
    }
}

Java

public class ExampleFragment extends Fragment {
    ...
    public void clearToolbarMenu() {

        viewBinding.myToolbar.getMenu().clear()

    }

}

Click-Events verarbeiten

Sie können eine OnMenuItemClickListener zur Symbolleiste hinzufügen. Klicken Sie dazu setOnMenuItemClickListener() . Dieser Listener wird aufgerufen, wenn der Nutzer einen Menüpunkt auswählt über die Aktionsschaltflächen am Ende der Symbolleiste oder verknüpfter Überlauf. Die ausgewählten MenuItem wird an die Methode onMenuItemClick() und können zum Verarbeiten der Aktion verwendet werden, wie im Folgenden gezeigt: Beispiel:

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        ...
        viewBinding.myToolbar.setOnMenuItemClickListener {
            when (it.itemId) {
                R.id.action_settings -> {
                    // Navigate to settings screen.
                    true
                }
                R.id.action_done -> {
                    // Save profile changes.
                    true
                }
                else -> false
            }
        }
    }
}

Java

public class ExampleFragment extends Fragment {
    ...
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        ...
        viewBinding.myToolbar.setOnMenuItemClickListener(item -> {
            switch (item.getItemId()) {
                case R.id.action_settings:
                    // Navigate to settings screen.
                    return true;
                case R.id.action_done:
                    // Save profile changes.
                    return true;
                default:
                    return false;
            }
        });
    }
}

Menü dynamisch anpassen

Wenn die App-Leiste zu deinem Fragment gehört, kannst du das Toolbar unter folgendem Link ändern: wie in jeder anderen Ansicht.

Um auf das vorherige Beispiel zurückzukommen: Die Menüoption Speichern sollte nun sind erst sichtbar, wenn der Nutzer mit der Bearbeitung beginnt. Danach sollte das Fenster ausgeblendet werden. noch einmal antippen:

Kotlin

class ExampleFragment : Fragment() {
    ...
    fun updateToolbar() {
        isEditing = !isEditing

        val saveItem = viewBinding.myToolbar.menu.findItem(R.id.action_done)
        saveItem.isVisible = isEditing

    }
}

Java

public class ExampleFragment extends Fragment {
    ...
    public void updateToolbar() {
        isEditing = !isEditing;

        MenuItem saveItem = viewBinding.myToolbar.getMenu().findItem(R.id.action_done);
        saveItem.setVisible(isEditing);
    }

}

Falls vorhanden, wird die Navigationsschaltfläche am Anfang der Symbolleiste angezeigt. Durch das Festlegen eines Navigationssymbols in der Symbolleiste wird diese sichtbar. Sie können auch Navigationsspezifisches onClickListener() festlegen, das immer aufgerufen wird, wie die Nutzenden auf die Navigationsschaltfläche Beispiel:

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        ...
        myToolbar.setNavigationIcon(R.drawable.ic_back)

        myToolbar.setNavigationOnClickListener { view ->
            // Navigate somewhere.
        }
    }
}

Java

public class ExampleFragment extends Fragment {
    ...
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        ...
        viewBinding.myToolbar.setNavigationIcon(R.drawable.ic_back);
        viewBinding.myToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Navigate somewhere.
            }
        });
    }
}