ActionBarSherlock icon indicating copy to clipboard operation
ActionBarSherlock copied to clipboard

SherlockFragment.onCreateOptionsMenu() called too early

Open schildbach opened this issue 13 years ago • 0 comments

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)

schildbach avatar Nov 30 '12 21:11 schildbach