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 должен переопределить или реализовать метод супертипа.

Kevin
источник
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);
Йоанн Херкуэ
10
onCreateOptionsMenu () для фрагментов имеет другие аргументы, чем для Activity.
Хорхе
3
а также другой тип возврата как void в отличие от логического значения onCreateOptionsMenu () в действии, как упомянуто выше.
Декстер
4
Интересное примечание: если вы также переопределяете onCreateOptionsMenu в вашей содержащей активности, будут отображаться оба пункта меню параметров.
Адам Джонс
5
setHasOptionsMenu(true);должен быть вызван, onCreate()чтобы быть полным.
Роел
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 / фрагмент_меню.xml, определяющий action_1 и action_2 .

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

  • action_1 из res / menu / фрагмент_меню.xml
  • action_2 из res / 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);
}
Кешав Гера
источник