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

5 138

5 ответов:

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

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

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

setHasOptionsMenu(true);

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

я попробовал ответы @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);
}

Я надеюсь, что этот ответ может быть полезен для кого-то с той же проблемой.

вызов

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