ActionBarSherlock
ActionBarSherlock copied to clipboard
SherlockFragment.onCreateOptionsMenu() called too early
In my fragment, I'm calling setHasOptionsMenu(true) in onCreate(). Although I could not find an explicit instruction, I believe most people put it there and not in for example onViewCreated().
However, on Pre-Android-4.0 setHasOptionsMenu causes a call to onCreateOptionsMenu(). This is not the case with the native ICS action bar.
I argue that onCreateOptionsMenu() is called to early, given that the fragment could not initialize properly. Sure, there are workarounds like moving setHasOptionsMenu() around. Still, this is not pretty.
Tested with ABS 4.2.0.
Here is a stacktrace that you can use to debug the call hierarchy:
E/AndroidRuntime( 1048): at de.schildbach.wallet.ui.RequestCoinsFragment.onCreateOptionsMenu(RequestCoinsFragment.java:213)
E/AndroidRuntime( 1048): at android.support.v4.app.Watson.onCreatePanelMenu(Watson.java:56)
E/AndroidRuntime( 1048): at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:559)
E/AndroidRuntime( 1048): at com.actionbarsherlock.internal.ActionBarSherlockCompat.preparePanel(ActionBarSherlockCompat.java:479)
E/AndroidRuntime( 1048): at com.actionbarsherlock.internal.ActionBarSherlockCompat.dispatchInvalidateOptionsMenu(ActionBarSherlockCompat.java:272)
E/AndroidRuntime( 1048): at com.actionbarsherlock.app.SherlockFragmentActivity.invalidateOptionsMenu(SherlockFragmentActivity.java:150)
E/AndroidRuntime( 1048): at com.actionbarsherlock.app.SherlockFragmentActivity.supportInvalidateOptionsMenu(SherlockFragmentActivity.java:156)
E/AndroidRuntime( 1048): at android.support.v4.app.Fragment.setHasOptionsMenu(Fragment.java:708)
E/AndroidRuntime( 1048): at de.schildbach.wallet.ui.RequestCoinsFragment.onCreate(RequestCoinsFragment.java:95)
E/AndroidRuntime( 1048): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:834)
E/AndroidRuntime( 1048): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1058)
E/AndroidRuntime( 1048): at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1156)
E/AndroidRuntime( 1048): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:270)
E/AndroidRuntime( 1048): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)