onCreate之前调用ListPreviousOptionsMenu。 为什么和如何修复/绕过?

好的,所以我有ListList扩展ListList扩展ListFragment:

public static class FavoritesList extends GalleryList { public static FavoritesList newInstance(int page) { FavoritesList list = new FavoritesList(); Bundle args = new Bundle(); args.putInt("page", page); list.setArguments(args); return list; } @Override public void onCreate(Bundle saveInstanceState) { super.onCreate(saveInstanceState); Cursor cursor = dbHelper.getGalleries(fav, preferences.getString("sort"+fav, "date desc")); listAdapter = new GalleryListAdapter(activity, cursor); setListAdapter(listAdapter); } ... @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.add(Menu.NONE, 0, 8, "Remove All"); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); //listAdapter is null the first time this is called... if (listAdapter != null && listlistAdapter.getCount() == 0) { menu.findItem(R.id.filter).setEnabled(false); menu.findItem(0).setEnabled(false); } else { menu.findItem(R.id.filter).setEnabled(true); menu.findItem(0).setEnabled(true); } } } 

这里是问题:onPrepareOptionsMenu被调用之前 onCreate(我初始化listAdapter)加载这个片段时,它被再次调用之前,选项菜单显示第一次!

当声明onPrepareOptionsMenu时, 显示菜单之前调用Fragment文档是错误的, 每次显示时都是如此。

PS我正在使用Android支持库(V4)。 有任何想法吗?

Solutions Collecting From Web of "onCreate之前调用ListPreviousOptionsMenu。 为什么和如何修复/绕过?"

尝试在onCreate()上调用invalidateOptionsMenu() onCreate() 。 请确保检查onPrepareOptionsMenu()上的列表适配器是否为null

所以,像这样愚蠢,这是一个运作的解决方法:

 public static class FavoritesList extends GalleryList { Menu optionsMenu; ... @Override public void onCreate(Bundle saveInstanceState) { super.onCreate(saveInstanceState); Cursor cursor = dbHelper.getGalleries(fav, preferences.getString("sort"+fav, "date desc")); listAdapter = new GalleryListAdapter(activity, cursor); setListAdapter(listAdapter); if (optionsMenu != null) { onPrepareOptionsMenu(optionsMenu); } } ... @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); optionsMenu = menu; if (listAdapter != null && listAdapter.getCount() == 0) { menu.findItem(R.id.filter).setEnabled(false); menu.findItem(0).setEnabled(false); } else { menu.findItem(R.id.filter).setEnabled(true); menu.findItem(0).setEnabled(true); } } } 

基本上,我在第一次运行onPrepareOptionsMenu时抓住了选项菜单,然后在listAdapter初始化后再次调用它。

编辑:显然没有检查如果optionsMenu是null,这将打破某些手机。 我应该已经意识到了。