У меня есть панель инструментов, а также панель навигации. Когда я запускаю свое приложение, создаются панель инструментов и панель навигации. Когда я нажимаю элементы в панели навигации, запускаются новые фрагменты и остается та же панель инструментов. Как мне в основном добавлять элементы меню на панель инструментов, такие как поиск, добавление, редактирование, когда я запускаю определенные фрагменты? Я хочу, чтобы они создавались не в начале программы, а динамически. Кроме того, как я могу щелкнуть эти кнопки и заставить их запускать другие фрагменты. Я хочу, чтобы в одном фрагменте кнопка редактирования на панели инструментов выполняла определенные действия по сравнению с кнопкой редактирования в другом фрагменте. Благодаря!
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"/>
Панель инструментов:
<?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"
/>
источник
menu.clear()
вonCreateOptionsMenu
- в противном случае вы будете наследовать меню от родителей тоже.Вот как динамически создавать меню: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html
Отредактировано:
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);
источник
actionBarToolbar.setOnMenuItemClickListener()
для обработки действий пункта меню.onOptionsItemSelected()
не вызывается в этой ситуации.Лучший способ сделать это:
1. Найдите панель инструментов в Activity и установите ее как supportActionBar.
Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar); setSupportActionBar(actionBarToolBar);
2. Тогда будет проще обработать меню опций для разных фрагментов в одном и том же Activity. В каждом фрагменте проделайте как хотите:
В вызове метода OnCreateView
setHasOptionsMenu(true);
И наконец,
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.main, menu); super.onCreateOptionsMenu(menu, inflater); }
А для управления щелчком по пунктам меню у нас есть 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); } }
источник
Самый простой вариант - сделать
toolbar.inflateMenu(R.menu.fragment_menu);
и для ручки нажмите на пункт меню
toolbar.setOnMenuItemClickListener { when (it.itemId) { R.id.nav_example -> doThat() } true }
источник
onCreateOptionsMenu
Метод переопределения в каждом вашем фрагменте.@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.your_menu_xml, menu); super.onCreateOptionsMenu(menu, inflater); }
источник
setTitle()
можно добавлять заголовки.Я решил эту проблему правильно. Мое решение выглядит следующим образом:
@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); }
источник
У меня была такая же проблема, и я хотел заменить меню панели инструментов в соответствии с отображаемым фрагментом.
Проблема, с которой я сейчас столкнулся, заключается в том, что меню добавлено к предыдущему.
Чтобы показать только меню фрагмента, предлагаю:
@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); }
Надеюсь, это поможет.
источник
Ниже приведены инструкции по отображению разных пунктов меню с разными фрагментами.
Шаг 1. Вызов setHasOptionsMenu (true)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { setHasOptionsMenu(true) super.onViewCreated(view, savedInstanceState) }
Шаг 2: Добавьте элементы меню параметров, связанных с фрагментом.
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) }
источник
Внутри XML добавьте эту строку
app:menu="@menu/main_menu"
источник
Используя новый MaterialToolbar , очень легко создать дополнительное меню и использовать его для:
<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"/>
а затем в коде для установки прослушивателей OnCLick просто добавьте это:
toolbar.setOnMenuItemClickListener { // .. DO SOMETHING HERE false }
источник