Pasek narzędzi Android Dodawanie elementów menu dla różnych fragmentów

90

Mam pasek narzędzi oraz szufladę nawigacji. Po uruchomieniu aplikacji tworzony jest pasek narzędzi i szuflada nawigacji. Kiedy klikam elementy w szufladzie nawigacji, uruchamia nowe fragmenty i zachowuje ten sam pasek narzędzi. Jak zasadniczo dodać elementy menu do paska narzędzi, takie jak wyszukiwanie, dodawanie, edycja, kiedy uruchamiam określone fragmenty? Nie chcę ich na początku programu, ale tworzone dynamicznie. Poza tym, jak mógłbym klikać te przyciski i uruchamiać inne fragmenty. Chcę, żeby w jednym fragmencie przycisk edycji na pasku narzędzi robił określoną rzecz w porównaniu do przycisku edycji w innym fragmencie. Dzięki!

Menu_toolbar:

<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item android:id="@+id/edit"
    android:orderInCategory="1"
    android:title="Edit"
    app:showAsAction="always"
    android:icon="@drawable/pencil_icon"/>
<item android:id="@+id/add"
    android:orderInCategory="1"
    android:title="Add"
    app:showAsAction="always"
    android:icon="@drawable/plus_icon"/>

Pasek narzędzi:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="#10a1ff"
android:title="Home"
/>
Joe Eigi
źródło

Odpowiedzi:

168

Dodaj podobny kod do swoich fragmentów:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
{
    View v = inflater.inflate(R.layout.library_fragment, parent, false);
    setHasOptionsMenu(true);
    return v;
}


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
   inflater.inflate(R.menu.your_menu_xml, menu);
   super.onCreateOptionsMenu(menu, inflater);
}

W ten sposób możesz dostosować menu do swoich fragmentów.

Gundu Bandgar
źródło
19
To jest prawidłowa odpowiedź, ponieważ wywołanie setHasOptionsMenu (true) jest wymagane dla wywołania metody onCreateOptionsMenu we fragmencie.
John Slavick,
15
Pamiętaj o powołanie menu.clear()się onCreateOptionsMenu- w przeciwnym razie będziesz dziedziczyć menu z rodziców też.
Dart Dega
@DartDega, gdzie umieściłem kod do wyczyszczenia? Fragment lub aktywność, proszę pana, nie widzę menuitem w moim fragmencie
famfamfam
Czy to działa z poziomem API 28? Nadal widzę główne pozycje menu działań
ArdenDev
33

Oto jak dynamicznie tworzyć menu: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

Edytowano:

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
actionBarToolBar.setNavigationIcon(R.drawable.icon);
actionBarToolBar.setNavigationContextDescription(getResources().getString(R.string.desc);
actionBarToolBar.setLogo(R.drawable.other_icon);
actionBarToolBar.setLogoDescription(getResources().getString(R.string.other_desc);
actionBarToolBar.inflateMenu(R.menu.fragment_menu);
Allen Chan
źródło
4
służy actionBarToolbar.setOnMenuItemClickListener()do obsługi działań pozycji menu. onOptionsItemSelected()nie zostanie wezwany w tej sytuacji.
Lahiru Chandima,
2
podanego linku już nie ma
Ashvin solanki
25

Najlepszy sposób na to:

1. Znajdź pasek narzędzi w Aktywności i ustaw go jako supportActionBar.

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);

2. Obsługa menu opcji dla różnych fragmentów w ramach tego samego działania będzie bułką z masłem. Wykonaj następujące czynności w każdym fragmencie, jak chcesz:

W wywołaniu metody OnCreateView

setHasOptionsMenu(true);

I na koniec

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

Aby zarządzać elementami menu, kliknij, mamy onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search :
            Log.i("item id ", item.getItemId() + "");
        default:
            return super.onOptionsItemSelected(item);
    }
}
Prateek Gupta
źródło
1
setHasOptionsMenu (true) jest naprawdę pomocne! Dziękuję U
J.Dragon
10

Zastąp onCreateOptionsMenumetodę w każdym swoim fragmencie.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu_xml, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Ellie Zou
źródło
@JoeEigi Dlaczego potrzebujesz innego paska narzędzi? Możesz ustawić różne tytuły i menu.
Ellie Zou,
@JoeEigi tak, możesz mieć niestandardowe menu, zawyżając niestandardowe menu xml. Połączenie setTitle()może dodawać tytuły.
Ellie Zou
@JoeEigi Wygląda na to, że zrozumiałeś zły kontekst, spójrz na to: stackoverflow.com/questions/26998455/ ...
Allen Chan
1
Wyłączyłem pasek akcji w moim manifeście, ale nadal pojawia się w moim układzie aktywności nad paskiem narzędzi. Jak się tego pozbyć
Joe Eigi
Tak, zrobiłem to i nadal pojawia się w moim układzie, ale zostaje
usunięty
4

Rozwiązałem ten problem poprawnie. Moje rozwiązanie wygląda następująco:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mRootView = inflater.inflate(R.layout.fragment_order_history, container, false);
    //getActivity().invalidateOptionsMenu();


    setHasOptionsMenu(true);

    return mRootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Hai Rom
źródło
Tak, poprawnie pokazałem menu. Ale jak to menu ukryć po zamknięciu fragmentu, mam na myśli, gdy przełączymy się na inny fragment np. Z a -> b, to menu nadal widoczne w pasku narzędzi fragmentu b.
Zeeshan Ahmed
użyj setHasOptionsMenu (false) w onCreateView fragmentu b.
Kannan_SJD
4

Miałem ten sam problem i chciałem podmienić menu paska narzędzi odpowiednio do wyświetlanego fragmentu.

Problem, przed którym teraz stoję, polega na tym, że menu zostało dodane do poprzedniego.

Aby wyświetlić tylko menu dla fragmentu proponuję:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     menu.clear(); //Empty the old menu
     inflater.inflate(R.menu.menu_fragment1, menu);
     super.onCreateOptionsMenu(menu, inflater);
}

Mam nadzieję, że to pomoże.

Matteo Gariglio
źródło
2
po prostu sprawdź, czy menu! = null przed wywołaniem .clear ()
mapo
2

Poniżej znajdują się kroki, aby pokazać różne opcje menu z różnymi fragmentami.

Krok 1: Wywołaj setHasOptionsMenu (true)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        setHasOptionsMenu(true)
        super.onViewCreated(view, savedInstanceState)

    }

Krok 2: Napompuj elementy menu opcji związanych z fragmentami.

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    // To clear previously added menu items
    menu?.clear()
    inflater?.inflate(R.menu.your_fragment_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}
takharsh
źródło
Pomogło mi to usunąć niechciany przycisk menu, który pojawił się w moim nowym menu
Im Batman
1

Wewnątrz XML dodaj tę linię

app:menu="@menu/main_menu"
AbdelraZek
źródło
1
Właściwie masz rację! Możesz to określić przez xml, a następnie we fragmencie: `` override fun onViewCreated (view: View, saveInstanceState: Bundle?) {Super.onViewCreated (view, saveInstanceState) toolBar.setNavigationOnClickListener {activity? .OnBackPressed ()} searchView = toolBar.menu.findItem (R.id.action_search) .actionView as SearchView searchView.setOnQueryTextListener (this)} ``
user3193413
0

Korzystając z nowego paska narzędzi MaterialToolbar , bardzo łatwo jest utworzyć rozszerzone menu i używać go do:

<com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_menu"
        app:menu="@menu/main_menu"/>

a następnie w kodzie, aby ustawić odbiorniki OnCLick, po prostu dodaj to:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
Amin Keshavarzian
źródło