OnCreateOptionsmenu вызывается один раз в viewpager с tablayout - PullRequest
0 голосов
/ 28 февраля 2019

У меня редкая проблема.У меня есть активность, в которой вкладки динамически заполнены (до 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 Ответ

0 голосов
/ 28 февраля 2019

Попробуйте вот так

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