Добавить меню в поддержку ActivityToolBar из фрагмента - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть 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);
}

1 Ответ

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

onPrepareOptionsMenu всегда вызывается после onCreateOptionsMenu и там вы удаляете свое недавно надутое меню!
Просто удалите onPrepareOptionsMenu и все должно работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...