0

I have a rare problem. I have an activity that has tabs populated dynamically (up to 20 tabs). Each fragment has an implementation of OnCreateOptionsMenu and a menu which contains a bookmark icon that changes color when pressed. There is a class variable menu of type Menu which is set when fragment's OnCreateOptionsMenu is called. This is to enable me set the bookmark menu item outside the onCreateOptionsMenu(This is also done dynamically).

Problem: When the parent activity have only a single tab(One fragment instance), this implementation works fine. However with more than one tab, the app crashes with the error: Attempt to invoke interface method android.view.MenuItem android.view.Menu.findItem(int)

What I think: I think the problem is that the OnCreateOptionsMenu is called once i.e Class variable: menu is set only once for the first tab (fragment) hence when other tabs are added, menu is null

Some codes: Fragment

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

P.S setHasOptionsMenu() is set to true in Fragment's OnCreate

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
Urchboy
  • 725
  • 2
  • 12
  • 26

1 Answers1

0

Try this way

    @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;
    }
Oshan Madusanka
  • 327
  • 3
  • 9