Панель инструментов Android Добавление элементов меню для разных фрагментов
У меня есть панель инструментов, а также навигационный ящик. Когда я запускаю свое приложение, панель инструментов и панель навигации создаются. Когда я щелкаю элементы в блоке навигации, он запускает новые фрагменты и сохраняет ту же панель инструментов. Как мне добавить пункты меню на панель инструментов, такие как поиск, добавление, редактирование, когда я запускаю определенные фрагменты? Я не хочу их в начале программы, но создается динамически. Кроме того, как я смогу нажать на эти кнопки и заставить их запускать другие фрагменты. Я хочу, чтобы в одном фрагменте кнопка редактирования на панели инструментов выполняла определенную функцию по сравнению с кнопкой редактирования в другом фрагменте. Спасибо!
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"
/>
Ответы
Ответ 1
Добавьте похожий код к своим фрагментам:
@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);
}
Таким образом, вы можете настроить меню для ваших фрагментов.
Ответ 2
Вот как создать меню динамически:
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);
Ответ 3
Лучший способ сделать это:
1. Найдите панель инструментов в действии и установите ее как supportActionBar.
Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
2. Тогда это будет кусок пирога, чтобы обрабатывать меню опций для разных фрагментов над одной и той же Деятельностью. Делайте следующие вещи в каждом фрагменте, как хотите:
В вызове метода 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);
}
}
Ответ 4
Переопределите метод onCreateOptionsMenu
в каждом фрагменте.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.your_menu_xml, menu);
super.onCreateOptionsMenu(menu, inflater);
}
Ответ 5
Я правильно решил эти проблемы. Мое решение выглядит следующим образом:
@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);
}
Ответ 6
У меня была такая же проблема, и я хотел заменить меню панели инструментов соответствующим образом отображаемому фрагменту.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что меню добавлено к предыдущему.
Чтобы отобразить только меню для фрагмента, я предлагаю:
@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);
}
Надеюсь, что это поможет.
Ответ 7
Ниже приведены шаги для отображения различных опций меню с различными фрагментами.
Шаг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)
}
Ответ 8
Самый простой вариант - сделать
toolbar.inflateMenu(R.menu.fragment_menu);