Панель инструментов Android Добавление пунктов меню для разных фрагментов

92

У меня есть панель инструментов, а также панель навигации. Когда я запускаю свое приложение, создаются панель инструментов и панель навигации. Когда я нажимаю элементы в панели навигации, запускаются новые фрагменты и остается та же панель инструментов. Как мне в основном добавлять элементы меню на панель инструментов, такие как поиск, добавление, редактирование, когда я запускаю определенные фрагменты? Я хочу, чтобы они создавались не в начале программы, а динамически. Кроме того, как я могу щелкнуть эти кнопки и заставить их запускать другие фрагменты. Я хочу, чтобы в одном фрагменте кнопка редактирования на панели инструментов выполняла определенные действия по сравнению с кнопкой редактирования в другом фрагменте. Благодаря!

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"
/>
Джо Эйги
источник

Ответы:

172

Добавьте аналогичный код в свои фрагменты:

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

Таким образом вы можете настроить меню для своих фрагментов.

Гунду Бандгар
источник
19
Это правильный ответ, поскольку вызов setHasOptionsMenu (true) требуется для метода onCreateOptionsMenu, вызываемого во фрагменте.
Джон Славик 06
15
Помните о вызове menu.clear()в onCreateOptionsMenu- в противном случае вы будете наследовать меню от родителей тоже.
Дарт Дега
@DartDega, где я должен очистить код? Фрагмент или активность Сэр, я не вижу пункт меню в моем фрагменте
famfamfam
Это работает с API уровня 28? Я все еще вижу основные пункты меню действий
ArdenDev
33

Вот как динамически создавать меню: 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);
Аллен Чан
источник
4
используйте actionBarToolbar.setOnMenuItemClickListener()для обработки действий пункта меню. onOptionsItemSelected()не вызывается в этой ситуации.
Лахиру Чандима
2
данной ссылки больше нет
Ashvin solanki
28

Лучший способ сделать это:

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);
    }
}
Пратик Гупта
источник
1
setHasOptionsMenu (true) действительно полезен! Спасибо
J.Dragon
11

Самый простой вариант - сделать

toolbar.inflateMenu(R.menu.fragment_menu);

и для ручки нажмите на пункт меню

toolbar.setOnMenuItemClickListener {
    when (it.itemId) {
        R.id.nav_example -> doThat()
    }
    true
}
Гийом
источник
clickListener для меню, раздуваемого следующим образом: stackoverflow.com/a/26512114/2098878
Рафаэль
10

onCreateOptionsMenuМетод переопределения в каждом вашем фрагменте.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu_xml, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Элли Цзоу
источник
@JoeEigi Почему вам нужна другая панель инструментов? Вы можете установить другое название и меню.
Ellie Zou
@JoeEigi: да, вы можете создать собственное меню, увеличив его в xml. Звоните, setTitle()можно добавлять заголовки.
Ellie Zou
@JoeEigi Кажется, у вас неправильный контекст, взгляните на это: stackoverflow.com/questions/26998455/…
Аллен Чан
1
Я отключил панель действий в своем манифесте, но все еще отображается в макете действий над панелью инструментов. Как мне от этого избавиться?
Джо Эйги
Да, сделал это, и все еще отображается в моем макете, но не отображается
Джо Эйги
4

Я решил эту проблему правильно. Мое решение выглядит следующим образом:

@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);
}
Хай Ром
источник
Да я правильно показал меню. Но как скрыть это меню при закрытии фрагмента, я имею в виду, когда мы переключаемся на другой фрагмент, например, с a -> b, меню a все еще отображается на панели инструментов фрагмента b.
Зишан Ахмед 01
используйте setHasOptionsMenu (false) в onCreateView фрагмента b.
Kannan_SJD
4

У меня была такая же проблема, и я хотел заменить меню панели инструментов в соответствии с отображаемым фрагментом.

Проблема, с которой я сейчас столкнулся, заключается в том, что меню добавлено к предыдущему.

Чтобы показать только меню фрагмента, предлагаю:

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

Надеюсь, это поможет.

Маттео Гариглио
источник
2
просто проверьте, если menu! = null перед вызовом .clear ()
mapo
2

Ниже приведены инструкции по отображению разных пунктов меню с разными фрагментами.

Шаг 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)
}
тахарш
источник
Это помогло мне удалить ненужную кнопку меню, которая появилась в моем новом меню
Im Batman
1

Внутри XML добавьте эту строку

app:menu="@menu/main_menu"
Мохамед АбдельраЗек
источник
1
Собственно ты прав! Вы можете указать это с помощью xml, а затем во фрагменте: `` override fun onViewCreated (view: View, savedInstanceState: Bundle?) {Super.onViewCreated (view, savedInstanceState) toolBar.setNavigationOnClickListener {activity? .OnBackPressed ()} searchView = toolBar.menu.findItem (R.id.action_search) .actionView as SearchView searchView.setOnQueryTextListener (this)} ``
user3193413
0

Используя новый 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
        }
Амин Кешаварзян
источник