I need to remove the inflated menu after I return to Fragment 1 from Fragment 2 after some action.
I clear the menu after I make the popBackStack, but nevertheless the menu item can't be deleted.
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
if (savedItemsExist())
inflater.inflate(R.menu.menu_saved_filters, menu);
else
{
Log.i(TAG + " onCreateOptionsMenu", " going to delete");
menu.clear();
}
super.onCreateOptionsMenu(menu, inflater);
}
#Override
public void onPrepareOptionsMenu(Menu menu) {
menu.clear();
if (savedItemsExist())
getActivity().getMenuInflater().inflate(R.menu.menu_saved_filters, menu);
else{
menu.clear();
}
super.onPrepareOptionsMenu(menu);
}
If you have menu items tied to a Fragment's lifecycle, you should instead use setHasOptionsMenu(true) on your Fragment and then override onCreateOptionsMenu() in the Fragment, inflating your fragment's menu.
Maybe that is hack solution, but issue solved by replacing the Fragment 2 by Fragment 1 instead of popBackStack()
Related
My android app contains one main activity, two Fragment and one Dialog Fragment.
Main activity has an option menu.
Main Fragment use the main activity's option menu.
Second fragment has another option menu.
From second fragment, i can open the Dialog Fragment which contain
another set of option menu.
But when close the Dialog Fragment, option menus of all other fragment and activity are changed to that of Dialog Fragment.
MainActivity.java
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return super.onCreateOptionsMenu(menu);
}
SecondFragment.java
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
getActivity().getMenuInflater().inflate(R.menu.fragment_second, menu);
super.onCreateOptionsMenu(menu, inflater);
}
MyDialogFragment.java
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
getActivity().getMenuInflater().inflate(R.menu.fragment_dialog, menu);
super.onCreateOptionsMenu(menu, inflater);
}
Call invalidateOptionsMenu() in your second fragment.
Docs:
Declare that the options menu has changed, so should be recreated. The
onCreateOptionsMenu(Menu) method will be called the next time it needs
to be displayed.
In SecondFragment:
#Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getActivity().invalidateOptionsMenu();
}
I am using drawerlayout in activity with several fragments. By clicking the navigation item, I switch the fragment this way:
switch (index) {
case 0:
if (checkinFragment == null) {
checkinFragment = new CheckinFragment();
ft.add(R.id.main_container, checkinFragment, "0");
} else {
ft.show(checkinFragment);
}
break;
case 3:
if (jianGuanFragment == null) {
jianGuanFragment = new JianGuanFragment();
ft.add(R.id.main_container, jianGuanFragment, "3");
} else {
ft.show(jianGuanFragment);
}
break;
}
ft.commitAllowingStateLoss();
Each fragment has a different menu resource file inflated in its onCreateOptionsMenu(Menu menu, MenuInflater inflater) method.
Steps:
1. When first enter the activity the menu in checkinFragment is shown.(All right)
2. Then switch to the jianGuanFragment, the menu in jianGuanFragment is shown.(Also right)
3. However, when switch back to the first fragment(checkinFragment), the actionbar menu isn't updated. The showing menu is still the one in jianGuanFragment. That's the problem.
And from the log I know the onCreateOptionsMenu in the showing fragment is called each time I switch to it. That's to say:
onCreateOptionsMenu is called but actionbar menu isn't updated.
Anyone can help me? Thanks a lot.
EDIT 1: add the code in onCreateOptionsMenu:
(1)in checkinFragment
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
LogUtils.e("TAG", "CheckinFragment onCreateOptionsMenu");
menu.clear();
inflater.inflate(R.menu.menu_setting, menu);
}
(2)in jianGuanFragment
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
LogUtils.e("TAG", "JianGuanFragment onCreateOptionsMenu");
menu.clear();
inflater.inflate(R.menu.menu_jianguan, menu);
}
EDIT 2: I use toolbar, not the old actionbar.
At last I find the solution:
Each time entering a fragment, re-set the toolbar as ationbar again.
#Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
AppCompatActivity compatActivity = (AppCompatActivity) mActivity;
mToolbar = (Toolbar) compatActivity.findViewById(toolbarId);
compatActivity.setSupportActionBar(mToolbar);
}
}
Try this
1)in checkinFragment
#Override
public void onPrepareOptionsMenu(Menu menu) {
menu.clear();
LogUtils.e("TAG", "CheckinFragment onCreateOptionsMenu");
getActivity().getMenuInflater().inflate(R.menu.menu_setting, menu);
super.onPrepareOptionsMenu(menu);
}
Use invalidateOptionsMenu(). You need to use it where call to OnCreateOptionsMenu() is required.
EDIT:
getActivity().invalidateOptionsMenu() can be used if you want to call it from Fragment.
Hope that helps!!!
I want to have completely different menu options in different fragment.I followed this post.But my fragment menu is adding with the activity menu.But i don't want to have activity menus in some of my fragments.
In SlidingDrawerActivity:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
In my fragment:
public Friends_Status_Comment_Fragment(){
setHasOptionsMenu(true);
}
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_add_comment,menu);
super.onCreateOptionsMenu(menu, inflater);
}
The Activities items are adding with the menu of fragment.How to stop it???
I'm not sure if I underestand your problem - in your fragment you should clear menu and create new one - and don't call super :) something like this:
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
menu.clear();
inflater.inflate(R.menu.menu_add_comment,menu);
}
I have implemented ActionBar Navigation using Fragment. In my App i have one Activity and rest is in Fragments. In my MainActivity i am implementing menu like this.
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
Two Fragments uses Navigation Drawer and in their respected fragments i am inflating menu buttons to sort items.
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.sort_button_shops, menu);
}
Now the Problem is if i open the Fragment 1 it works perfectly. When i open fragment 2, it shows 2 button to sort, one from Fragment 1 and the second one from Fragment 2.
I have tried to hide the button but it didn't worked.
Any Help will be Appreciated.
Thanks
When you inflate a new menu you are adding new items to the old Menu object, which is probably not what you intended.
Try this:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.removeItem(R.id.your_menu_item);
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
Try using this in onResume() of fragments.
MenuItem item = (MenuItem) findViewById(R.menu.activity_main);
item.setVisible(false);
this.invalidateOptionsMenu();
Background
Developing for Android 3.0, I have a HostActivity that is the superclass of NotebooksActivity and NoteActivity. NotebooksActivity includes a fragment, NotebooksFragment.
In HostActivity, I include a menu that I want to appear at the rightmost end of the options menu in the ActionBar, i.e. all menu items in subclasses of HostActivity should appear to the left of the menu items added in HostActivity.
Menu inflation in HostActivity:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
final MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.host_menu, menu);
return super.onCreateOptionsMenu(menu);
}
The Problem
When I add menu items in NoteActivity, I achieve the desired order as expected:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.notebook_menu, menu);
return super.onCreateOptionsMenu(menu);
}
However, when I add menu items in NotebooksFragment, because of how Fragments work, onCreateOptionsMenu is called after the same method in HostActivity, resulting in HostActivity's menu items appearing before NotebooksFragment's.
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.notebooks_menu, menu);
SearchView sv = new SearchView(getActivity());
sv.setOnQueryTextListener(this);
menu.findItem(R.id.search_notebooks).setActionView(sv);
super.onCreateOptionsMenu(menu, inflater);
}
How can I achieve my desired menu ordering?
You can try using android:menuCategory and android:orderInCategory to more manually specify your ordering.
Or, use onPrepareOptionsMenu() in HostActivity, as that is called after onCreateOptionsMenu(). Downside is that it is called on every MENU button press, not just the first time.