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


89

У мене є панель інструментів, а також шухляда навігації. Коли я запускаю програму, створюється панель інструментів та панель навігації. Коли я натискаю елементи в панелі навігації, вона запускає нові фрагменти і зберігає ту саму панель інструментів. Як я в основному додаю на панель інструментів такі пункти меню, як пошук, додавання, редагування при запуску певних фрагментів? Я не хочу їх на початку програми, але створював динамічно. Крім того, як я зможу натискати ці кнопки і запускати інші фрагменти. Я хочу, щоб в одному фрагменті кнопка редагування на панелі інструментів виконувала певні дії порівняно з кнопкою редагування в іншому фрагменті. Дякую!

Меню_інструментів:

<?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"
/>

Відповіді:


167

Додайте подібний код до своїх фрагментів:

@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
Це правильна відповідь, оскільки для методу onCreateOptionsMenu, який викликається у фрагменті, потрібен виклик setHasOptionsMenu (true).
Джон Славік

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
даного посилання більше немає
Ашвін Соланкі

25

Найкращий спосіб зробити це:

1. Знайдіть панель інструментів у Activity і встановіть її як 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);
    }
}

1
setHasOptionsMenu (true) дійсно корисний! Дякую U
J.Dragon

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()може додавати заголовки.
Еллі Зоу,

@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, меню все ще видимого на панелі інструментів фрагмента b.
Zeeshan Ahmed

використовувати 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 (істина)

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, а потім у фрагменті: `` переопределить веселье onViewCreated (вид: View, savedInstanceState: Bundle?) {Super.onViewCreated (view, savedInstanceState) toolBar.setNavigationOnClickListener {Activity? .OnBackPress =)} searchView = toolBar.menu.findItem (R.id.action_search) .actionView as SearchView searchView.setOnQueryTextListener (this)} `` `
user3193413

0

Використовуючи нову панель інструментів MaterialTool , дуже просто створити переповнення меню та використовувати його для:

<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.