OnCreateOptionsMenu внутри фрагментов

Я разместил 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

попробуйте это,

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

И в onCreate добавьте эту строку, чтобы сделать параметры в вашем Toolbar

setHasOptionsMenu(true);

Ответ 2

У вашего уже есть автогенерированный файл 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

Ответ 3

Я попробовал ответить @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

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

Ответ 5

Вызов setSupportActionBar(toolbar) внутри onViewCreated(...) фрагмента @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ((MainActivity)getActivity()).setSupportActionBar(toolbar); setHasOptionsMenu(true); }