Praca z paskiem aplikacji

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
Rysunek 1. Przykładowy górny pasek aplikacji.

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
Rysunek 2. Menu opcji zawiera teraz Twoje menu .

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);
    }

}

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.
            }
        });
    }
}