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