górny pasek aplikacji; w tym samym miejscu u góry okna aplikacji informacje i działania na bieżącym ekranie.
![przykładowy górny pasek aplikacji](https://developer.android.google.cn/static/images/guide/fragments/top-app-bar.png?authuser=0000&hl=pl)
Własność paska aplikacji różni się w zależności od potrzeb Twojej aplikacji. Kiedy
za pomocą fragmentów, pasek aplikacji można zaimplementować jako
Należące do Ciebie konto ActionBar
przez aktywność hosta lub pasek narzędzi w układzie fragmentu.
Jeśli na wszystkich ekranach jest ten sam pasek aplikacji, który jest zawsze u góry rozciąga się na szerokość ekranu, użyj dostarczonego motywu pasek działań obsługiwany przez aktywność. Motywy aplikacji pasków aplikacji pomagają: o spójnym wyglądzie i miejscu na menu opcji oraz Przycisk w górę.
Użyj paska narzędzi hostowanego przez fragment, jeśli chcesz mieć większą kontrolę nad rozmiaru, położenia i animacji paska aplikacji na wielu ekrany. Możesz na przykład potrzebować zwijającego się paska aplikacji lub takiego, Zajmuje tylko połowę szerokości ekranu i jest wyśrodkowany w pionie.
Różne sytuacje wymagają odmiennych działań, takich jak zwiększanie menu i reagowanie na interakcję użytkownika. Omówienie i zaoszczędzić czas, stosując najlepsze z nich należy się upewnić, że aplikacja działa prawidłowo.
Przykłady w tym temacie odnoszą się do elementu ExampleFragment
, który zawiera
który można edytować. Fragment powoduje zwiększenie
Menu zdefiniowane w formacie XML na pasku aplikacji:
<!-- 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>
Menu zawiera 2 opcje: jedną służącą do nawigowania do ekranu profilu i drugą na zapisanie wszystkich zmian w profilu.
Pasek aplikacji należący do aktywności
Pasek aplikacji jest najczęściej własnością hosta. Gdy aplikacja pasek jest własnością aktywności, fragmenty mogą wchodzić w interakcje z paskiem aplikacji zastępując metody platformy wywoływane podczas tworzenia fragmentów.
Zarejestruj z aktywnością
Musisz poinformować system, że fragment paska aplikacji bierze udział w programie
w menu opcji. W tym celu wywołaj
setHasOptionsMenu(true)
w metodzie onCreate(Bundle)
Twojego fragmentu, jak widać w tym przykładzie
przykład:
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)
informuje system, że Twój fragment
Użytkownik chce otrzymywać wywołania zwrotne związane z menu. Gdy reklama jest związana z menu
zachodzi takie zdarzenie, jak kliknięcie, metoda obsługi zdarzeń jest
najpierw jest wywoływane dla działania, a następnie dla fragmentu.
Nie należy jednak polegać na tej kolejności w logice aplikacji. Jeśli taki sam aktywność hostuje wiele fragmentów, każdy z nich może dostarczać menu W takim przypadku kolejność wywołań zwrotnych zależy od kolejności dodając fragmenty.
Powiększ menu
Aby scalić menu z menu opcji paska aplikacji, zastąp
onCreateOptionsMenu()
we fragmencie. Ta metoda otrzymuje bieżące menu na pasku aplikacji i
MenuInflater
jako parametrów. Używaj
rozszerzać menu, aby utworzyć wystąpienie menu z danym fragmentem, a następnie
możesz scalić je z bieżącym menu, jak w tym przykładzie:
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); } }
Ilustracja 2 przedstawia zaktualizowane menu.
![menu opcji zawiera teraz fragment menu](https://developer.android.google.cn/static/images/guide/fragments/app-bar-added.png?authuser=0000&hl=pl)
Obsługa zdarzeń kliknięcia
Każda aktywność i fragment w menu opcji mogą
reagować na dotknięcia. Fragment
onOptionsItemSelected()
odbiera wybraną pozycję menu jako parametr i zwraca wartość logiczną
aby wskazać, czy użytkownik kliknął reklamę. Raz
aktywność lub fragment zwraca true
z onOptionsItemSelected()
, nie
inne fragmenty biorące udział otrzymają wywołanie zwrotne.
W implementacji onOptionsItemSelected()
stosuj switch
w itemId
pozycji menu. Jeśli wybrany element
należy do Ciebie, prawidłowo dotykaj ekranu i zwracaj true
, by wskazać,
obsługiwane jest zdarzenie kliknięcia. Jeśli wybrany element nie jest
, wywołaj implementację super
. Domyślnie super
implementacja zwraca wartość false
, aby umożliwić kontynuowanie przetwarzania menu.
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); } } }
Dynamiczne modyfikowanie menu
Umieść element logiczny, aby ukryć lub pokazać przycisk albo zmienić ikonę
onPrepareOptionsMenu()
Ta metoda jest wywoływana tuż przed wyświetleniem menu.
Zgodnie z poprzednim przykładem przycisk Zapisz powinien być
niewidoczne, dopóki użytkownik nie rozpocznie edytowania i powinien zniknąć po
zapisane przez użytkownika. Dodanie tej logiki do onPrepareOptionsMenu()
sprawia, że
prawidłowe wyświetlanie menu:
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); } }
Gdy musisz zaktualizować menu, na przykład gdy użytkownik naciśnie
Przycisk Edytuj, aby edytować informacje na profilu, zadzwoń
invalidateOptionsMenu()
.
na aktywność hosta, aby zażądać wywołania systemowego onCreateOptionsMenu()
.
Po unieważnieniu możesz wprowadzić zmiany w programie onCreateOptionsMenu()
. Jednorazowo
menu się powiększy, system wywołuje onPrepareOptionsMenu()
i aktualizuje dane.
aby odzwierciedlić bieżący stan fragmentu.
Kotlin
class ExampleFragment : Fragment() { ... fun updateOptionsMenu() { isEditing = !isEditing requireActivity().invalidateOptionsMenu() } }
Java
public class ExampleFragment extends Fragment { ... public void updateOptionsMenu() { isEditing = !isEditing; requireActivity().invalidateOptionsMenu(); } }
Pasek aplikacji należący do fragmentu
Jeśli większość ekranów w aplikacji nie wymaga paska aplikacji
musi mieć inny pasek aplikacji niż pozostałe,
Toolbar
na
układu fragmentu. Chociaż możesz dodać Toolbar
w dowolnym miejscu
w hierarchii widoków fragmentu, zwykle utrzymujesz ją na szczycie
na ekranie. Aby użyć elementu Toolbar
we fragmencie, podaj identyfikator i
uzyskać odniesienie do niego we fragmencie, jak w przypadku każdego innego
widok. Możesz też animować pasek narzędzi za pomocą
CoordinatorLayout
zachowań.
<androidx.appcompat.widget.Toolbar
android:id="@+id/myToolbar"
... />
Jeśli używasz paska aplikacji należącego do fragmentu, Google zaleca użycie tagu
Interfejsy API usługi Toolbar
bezpośrednio. Nie używaj
setSupportActionBar()
.
i interfejsy API menu Fragment
, które nadają się tylko do pasków aplikacji należących do aktywności.
Powiększ menu
Wygodna metoda Toolbar
inflateMenu(int)
pobiera identyfikator
jako parametru zasobów menu. Aby powiększyć zasób menu XML do
na pasku narzędzi, przekaż do tej metody resId
, jak w tym przykładzie
przykład:
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); } }
Aby powiększyć inny zasób menu XML, wywołaj tę metodę ponownie, używając funkcji
resId
nowego menu. Nowe pozycje menu zostaną dodane do menu,
Istniejące pozycje menu nie zostaną zmodyfikowane ani usunięte.
Jeśli chcesz zastąpić obecny zestaw menu, wyczyść menu przed
wywołując funkcję inflateMenu(int)
z nowym identyfikatorem menu, jak pokazano poniżej
przykład:
Kotlin
class ExampleFragment : Fragment() { ... fun clearToolbarMenu() { viewBinding.myToolbar.menu.clear() } }
Java
public class ExampleFragment extends Fragment { ... public void clearToolbarMenu() { viewBinding.myToolbar.getMenu().clear() } }
Obsługa zdarzeń kliknięcia
Możesz przesłać
OnMenuItemClickListener
bezpośrednio na pasek narzędzi
setOnMenuItemClickListener()
. Ten detektor jest wywoływany, gdy użytkownik wybierze pozycję menu
używając przycisków poleceń na końcu paska narzędzi lub
powiązane rozszerzenie. Wybrane
Wartość MenuItem
jest przekazywana do detektora
onMenuItemClick()
i może być wykorzystane do skonsumowania działania, jak w poniższym przykładzie
przykład:
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; } }); } }
Dynamiczne modyfikowanie menu
Jeśli właścicielem paska aplikacji jest Twój fragment, możesz zmodyfikować Toolbar
na stronie
w środowisku wykonawczym,
tak samo jak każdy inny widok.
Zgodnie z poprzednim przykładem opcja menu Zapisz powinna wyglądać tak: niewidoczne, dopóki użytkownik nie rozpocznie edytowania i powinien zniknąć po kliknięciu:
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); } }
Dodaj ikonę nawigacji
Jeśli ten przycisk jest dostępny, będzie on widoczny na początku paska narzędzi.
Ustawienie ikony nawigacji na pasku narzędzi powoduje jej wyświetlanie. Możesz też
ustaw funkcję onClickListener()
związaną z nawigacją, która będzie wywoływana za każdym razem,
użytkownik klika przycisk nawigacyjny, jak pokazano poniżej
przykład:
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. } }); } }