onCreateOptionsMenu всередині фрагментів


182

Я розмістив setHasOptionsMenu(true)всередині onCreateView, але все ще не можу зателефонувати onCreateOptionsMenuвсередині фрагментів.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                         Bundle savedInstanceState) {   
   setHasOptionsMenu(true);             
   return inflater.inflate(R.layout.facesheet, container, false);
}

Нижче мій onCreateOptionsMenuкод.

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    getSupportMenuInflater().inflate(R.menu.layout, menu);
    return (super.onCreateOptionsMenu(menu));
}

Я отримую повідомлення про помилку:

Метод onCreateOptionsMenu(Menu)типу Fragment повинен перекрити або реалізувати метод супертипу.


1
Дякую за 'setHasOptionsMenu (true);', я шукав це.
Fabricio PH

Відповіді:


497

спробуйте це,

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}

І onCreateдодайте цей рядок, щоб параметри відображалися у вашомуToolbar

setHasOptionsMenu(true);

182
він не зателефонує, якщо ви не додасте цей рядок:setHasOptionsMenu(true);
Yoann Hercouet

10
onCreateOptionsMenu () для фрагментів має інші аргументи, ніж для Activity.
Хорхе

3
а також інший тип повернення як недійсний на відміну від булевого onCreateOptionsMenu () в діяльності, як зазначено вище в ans.
Декстер

4
Цікава примітка: якщо ви також перекриєте onCreateOptionsMenu у своїй активності, відобразяться обидва пункти меню.
Адам Джонс

5
setHasOptionsMenu(true);повинен бути закликаний, onCreate()щоб бути завершеним.
Roel

21

У вас вже є автогенерований файл res / menu / menu.xml, що визначає параметри action_settings .

У вашому MainActivity.java є такі методи:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_settings:
            // do stuff, like showing settings fragment
            return true;
    }

    return super.onOptionsItemSelected(item); // important line
}

У onCreateView()способі вашого виклику фрагмента:

setHasOptionsMenu(true); 

а також додайте ці 2 способи:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fragment_menu, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_1:
            // do stuff
            return true;

        case R.id.action_2:
            // do more stuff
            return true;
    }

    return false;
}

Нарешті, додайте новий файл res / menu / fragment_menu.xml, що визначає action_1 та action_2 .

Таким чином, коли у вашому додатку відображається фрагмент, його меню буде містити 3 записи:

  • action_1 з res / menu / fragment_menu.xml
  • action_2 з res / menu / fragment_menu.xml
  • action_settings з res / menu / menu.xml

1
питання було всередині фрагментів, а не активності
OlivierM

2
@OlivierM відповідь пояснює меню фрагментів. Я оцінив пояснення того, як воно взаємодіє з меню діяльності.
Аранда

13

Я спробував відповіді @Alexander Farber та @Sino Raj. Обидві відповіді є приємними, але я не міг використати onCreateOptionsMenu всередині свого фрагмента, поки я не з'ясував, чого не вистачає:

Додати setSupportActionBar (панель інструментів) у мою діяльність, як це:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.id.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

Я сподіваюся, що ця відповідь може бути корисною для когось із тією ж проблемою.


4

Дзвінок

setSupportActionBar(toolbar)

всередині

onViewCreated(...) 

фрагмента

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    ((MainActivity)getActivity()).setSupportActionBar(toolbar);
    setHasOptionsMenu(true);
}

1
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_add_customer, container, false);
        setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.