У меня есть Activity
с Toolbar
, который я установил как supportActionBar
.Из этого Activity
у меня есть различные Fragments
каждый с индивидуальным ActionBar
.Я могу позвонить menu.clear()
, чтобы удалить существующий Menu
, но я не могу добавить еще Menu
в тот же Fragment
.Это кажется странным, потому что menu.clear()
ведет себя так, как я ожидал, но при вызове inflater.inflate(R.menu.my_custom_menu,menu);
, похоже, ничего не делает.
Пример фрагмента, в котором я хочу изменить supportActionBar
:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar();
mGroupViewModel =
ViewModelProviders.of(requireActivity()).get(GroupsViewModel.class);
}
...
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//Inflating seems to do nothing.
Log.i(TAG,"IN THE ONCREATEOPTIONSMENU FOR FRAGMENT.");
inflater.inflate(R.menu.group_edit_toolbar,menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
Log.i(TAG,"ONPREPARE OPTIONS MENU IN FRAGMENT.");
menu.clear();
super.onPrepareOptionsMenu(menu);
}
Очевидно, что есть кое-что, чего я не понимаю, но я не могу сузить, в чем заключается эта проблема.
Лучше было бы, чтобы у каждого Fragment
были свои Toolbar
вместо всехмои фрагменты, изменяющие активность хостинга supportActionBar
?
ОБНОВЛЕНИЕ После дальнейшего тестирования я замечаю, что если я пытаюсь назначить локальный MenuItem
в моем Fragment
, я получаю нольисключение указателя, если я сначала не надуваю меню в самом Fragment
.Это наводит меня на мысль, что я не угоняю контроль над Activity
supportActionBar
в Fragment
, а скорее пытаюсь создать отдельный ActionBar
для Fragment
.Кто-нибудь сможет дополнить мое мышление здесь?
Fragment
Обратные вызовы меню:
MenuItem editItem;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.i(TAG,"IN ONCREATEOPTIONS");
menu.clear();
//MUST INFLATE MENU OTHERWISE WE GET NULL ERROR.
inflater.inflate(R.menu.home_actionbar,menu);
editItem = menu.findItem(R.id.action_edit_group);
Log.i(TAG,"edititem: "+editItem.getItemId());
super.onCreateOptionsMenu(menu, inflater);
}
// This is called every time the Menu opens.
@Override
public void onPrepareOptionsMenu(Menu menu) {
Log.i(TAG,"IN THE on prepare FOR FRAGMENT.");
menu.findItem(R.id.action_create_group).setVisible(false);
menu.findItem(R.id.action_create_group).setEnabled(false);
if(owner.equals(currUser)){
menu.findItem(R.id.action_edit_group).setEnabled(true);
menu.findItem(R.id.action_edit_group).setVisible(true);
} else {
menu.findItem(R.id.action_edit_group).setVisible(false);
menu.findItem(R.id.action_edit_group).setEnabled(false);
}
super.onPrepareOptionsMenu(menu);
}