OnCreateOptionsMenu вызывается перед onCreate android

Я начинаю андроид, и я разрабатываю небольшое приложение для Android. В моем приложении я использую библиотеку Шерлока. Мое приложение содержит одно основное действие и два фрагмента. В моем списке структура фрагментов выглядит так:

public class MyCards extends SherlockListFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside fragment on create"); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on activity created"); } private void displayCards(int type) { Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside display cards"); } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); } @Override public void onDestroy() { super.onDestroy(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.mycards, container, false); View view1 = inflater.inflate(R.layout.empty_card, container, false); return view; } /*@Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); optionsMenu = menu; }*/ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_type2, menu); Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on create option menu"); Spinner spinner = (Spinner) menu.findItem(R.id.cardType) .getActionView(); SpinnerAdapter adapter = ArrayAdapter.createFromResource(getSherlockActivity().getSupportActionBar().getThemedContext(), R.array.card_action_list,android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); // set the adapter spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { displayCards(pos); Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on option selected"); } @Override public void onNothingSelected(AdapterView<?> arg0) { displayCards(0); Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on no option selection"); } }); @Override public boolean onOptionsItemSelected(MenuItem item) { Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside option select listener"); } } 

Теперь моя проблема заключается в том, что когда я впервые переключаю один фрагмент на другой фрагмент, он дает следующий вывод журнала

 01-04 00:54:06.997: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside on create option menu 01-04 00:54:06.997: W/KeyCharacterMap(2575): No keyboard for id -1 01-04 00:54:06.997: W/KeyCharacterMap(2575): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 01-04 00:54:07.020: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside fragment on create 01-04 00:54:07.036: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside on activity created 

Это означает, что для параметра create, созданного до создания onfragment и создания активности. И это также дает два предупреждения. Эта работа устраняет любую ошибку. Но я не могу показать свой список

Теперь, когда я снова переключаюсь на один и тот же фрагмент (второй раз), он дает следующий выход журнала

 02-07 10:05:10.983: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on create option menu 02-07 10:05:11.023: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside fragment on create 02-07 10:05:11.043: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on activity created 02-07 10:05:11.113: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside display cards 02-07 10:05:11.133: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on option selected 

На этот раз он не дает никаких предупреждений и работает нормально. Также отображает мой список. Но в первый раз он работает некорректно. Другое дело, что когда я запускал его на более высокой версии Android, он работал нормально. Но если я запустил его на более низкую версию Android, как 2.3.3, я покажу такое поведение. Я прочитал об этом ListFragment onPrepareOptionsMenu, который вызывается перед onCreate. Почему и как исправить / обходить? Но я не могу решить эту проблему.

Если я определяю setHasOptionsMenu(true) внутри onActivityCreated он дает следующий вывод

 01-04 03:32:38.622: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside fragment on create 01-04 03:32:38.653: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside on activity created 01-04 03:32:38.692: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside on create option menu 01-04 03:32:38.700: W/KeyCharacterMap(8157): No keyboard for id -1 01-04 03:32:38.700: W/KeyCharacterMap(8157): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 

Я также попытался установить setHasOptionsMenu для моего фрагмента, где происходит фактическая транзакция фрагмента, как показано ниже.

 @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { MyCards mc = new MyCards(); mc.setHasOptionsMenu(true); ft = mActivity.getSupportFragmentManager().beginTransaction(); mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); ft.add(android.R.id.content, mFragment, mTag); ft.commit(); } 

И все же он дает ту же проблему.

Любая проблема с моим кодом или чем-то еще? Итак, как решить эту проблему. Нужна помощь … спасибо …

Написать setHasOptionsMenu(true); В onActivityCreated(Bundle savedInstanceState) .

Я не знаю, почему это работает так, но сделайте следующее: установите параметр setHasOptionsMenu(true) в своей деятельности, когда вы добавляете к нему свой фрагмент.

Например:

 //Activity class YourListFragment f = new YourListFragment(); f.setHasOptionsMenu(true); //here getSupportFragmentManager().beginTransaction() .add(R.id.your_list_fragment_container, f).commit(); 

И удалите настройку в коде вашего фрагмента. Это сработало для меня.