OnCreateOptionsmenu вызывается один раз в viewpager с tablayout

У меня редкая проблема. У меня есть активность, в которой вкладки динамически заполнены (до 20 вкладок). Каждый фрагмент имеет реализацию OnCreateOptionsMenu и меню, которое содержит значок закладки, который меняет цвет при нажатии. Есть переменная класса menu типа Menu который устанавливается, когда фрагмент OnCreateOptionsMenu называется. Это позволяет мне установить пункт меню закладки вне onCreateOptionsMenu(Это тоже делается динамически).

Проблема: когда родительская активность имеет только одну вкладку (один экземпляр фрагмента), эта реализация работает нормально. Однако с более чем одной вкладкой приложение вылетает с ошибкой: Attempt to invoke interface method android.view.MenuItem android.view.Menu.findItem(int)

Я думаю: проблема в том, что OnCreateOptionsMenu вызывается один раз, т.е. переменная класса: menu устанавливается только один раз для первой вкладки (фрагмента), следовательно, при добавлении других вкладок, menu является null

Некоторые коды: Фрагмент

Menu menu;
...
...
@Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
 setMenuBookmark(ques_obj);
}

private void setMenuBookmark(QuestionAnswerList ques_obj){
        MenuItem menuBookmark = this.menu.findItem(R.id.action_bookmark);

        if (ques_obj.getIs_bookmarked().equals("1")) {
            menuBookmark.setIcon(R.drawable.ic_bookmark_white_24dp);
        } else {
            menuBookmark.setIcon(R.drawable.ic_bookmark_border_white_24dp);
        }
    }

...
...

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.cbt_fragment_menu, menu);
        this.menu = menu;

        super.onCreateOptionsMenu(menu, inflater);
    }

PS setHasOptionsMenu() имеет значение true в OnCreate фрагмента

1 ответ

Попробуй так

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


         new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                getActivity().invalidateOptionsMenu()
            }
         }, 500 );

    }



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

         MenuItem menuBookmark = menu.findItem(R.id.action_bookmark)

         if (ques_obj.getIs_bookmarked().equals("1")) {
            menuBookmark.setIcon(R.drawable.ic_bookmark_white_24dp);
         } else {
            menuBookmark.setIcon(R.drawable.ic_bookmark_border_white_24dp);
         }

         return true;
    }