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"
/>
źródło
menu.clear()
sięonCreateOptionsMenu
- w przeciwnym razie będziesz dziedziczyć menu z rodziców też.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);
źródło
actionBarToolbar.setOnMenuItemClickListener()
do obsługi działań pozycji menu.onOptionsItemSelected()
nie zostanie wezwany w tej sytuacji.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); } }
źródło
Zastąp
onCreateOptionsMenu
metodę 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); }
źródło
setTitle()
może dodawać tytuły.Najprostszą opcją jest zrobienie
toolbar.inflateMenu(R.menu.fragment_menu);
źródło
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); }
źródło
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.
źródło
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) }
źródło
Wewnątrz XML dodaj tę linię
app:menu="@menu/main_menu"
źródło
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 }
źródło