Ü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">![Beispiel für die obere App-Leiste](https://developer.android.com/static/images/guide/fragments/top-app-bar.png?authuser=9&hl=de)
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">![Das Optionsmenü enthält jetzt Ihr Menüfragment.](https://developer.android.com/static/images/guide/fragments/app-bar-added.png?authuser=9&hl=de)
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); } }
Navigationssymbol hinzufügen
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. } }); } }