Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onCreateOptionsMenu called after onResume on JB 4.2

Tags:

I have the following fragment in my application:

public class MyFragment extends SherlockListFragment implements LoaderManager.LoaderCallbacks<Cursor> {   private MenuItem refresh = null;    @Override   public void onActivityCreated(Bundle savedInstanceState) {     super.onActivityCreated(savedInstanceState);     setHasOptionsMenu(true);      //.....      // NPE here     refresh.setActionView(R.layout.indeterminate_progress_action);     getActivity().getSupportLoaderManager().initLoader(0, null, this);   }    @Override   public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {     inflater.inflate(R.menu.refresh_menu, menu);     refresh = (MenuItem) menu.findItem(R.id.menu_item_refresh);   }    @Override   public void onLoadFinished(Loader<Cursor> loader, Cursor data) {     mAdapter.swapCursor(data);     refresh.setActionView(null);   } } 

Basically when the user starts the Activity I want to display a progress spinner, in the actionbar, until the loader completes. Prior to Android 4.2 everything worked fine. On Android 4.2 I get the following error:

11-24 13:37:14.811: E/AndroidRuntime(17850): Caused by: java.lang.NullPointerException 11-24 13:37:14.811: E/AndroidRuntime(17850):    at com.MyApp.library.fragments.MyFragment.onActivityCreated(TabFragment.java:65) 

After adding some break point I realized onCreateOptionsMenu was getting called after onActivityCreated. Is there another life cycle event I can use? Is there a better was to achieve the desired effect?

like image 867
Frohnzie Avatar asked Nov 24 '12 18:11

Frohnzie


1 Answers

I've used onPrepareOptionsMenu in this way to achieve what you are trying to do. (not tested but should give you an idea.)

private boolean mIsLoading = true;  @Override public void onPrepareOptionsMenu(Menu menu) {     super.onPrepareOptionsMenu(menu);     refresh = (MenuItem) menu.findItem(R.id.menu_item_refresh);     if (!mIsLoading) {         refresh.setActionView(null);     } }  @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) {     mAdapter.swapCursor(data);     mIsLoading = false;     getActivity().invalidateOptionsMenu(); } 
like image 67
JRomero Avatar answered Sep 18 '22 16:09

JRomero