Панель инструментов 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
        }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.