在JB 4.2上,onCreateOptionsMenu在onResume之后被调用

22

我在我的应用程序中有以下代码片段:

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);
  }
}

基本上,当用户启动Activity时,我希望在ActionBar中显示一个进度旋转器,直到加载完成。在Android 4.2之前,一切都正常。但在Android 4.2上,我遇到了以下错误:

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)

在添加了一些断点后,我意识到onCreateOptionsMenu在onActivityCreated之后被调用。有没有其他的生命周期事件可以使用?是否有更好的方法来实现所需的效果?


2
嗯,为什么不把你的 setActionView() 调用移到 onCreateOptionsMenu() 中呢?或许可以根据加载是否完成来有条件地执行它? - CommonsWare
有点奇怪。似乎onCreateOptionsMenuonLoadFinished之后也会被调用。由于我有多个加载器的选项卡,因此hasRunningLoaders无法确定加载是否已完成。猜想我将不得不使用布尔值来跟踪状态。 - Frohnzie
6
安卓问题:http://code.google.com/p/android/issues/detail?id=39721该链接为一个安卓应用程序的问题反馈页面,其中包含用户提交的关于应用程序崩溃、错误和其他问题的详细描述。该页面还包括开发者对这些问题的回复和解决方案。 - Frohnzie
你能发一下完整的错误信息吗?第65行代码是什么?另外,在使用对象之前,你能不能先检查一下它是否为“!= null”?我之前在onCreateOptionsMenu中就修复过类似的问题。 - Jared Burrows
也许这就是你的问题..? - Alexander Sidikov Pfeif
我有同样的问题,在Marshmallow上,onCreateOptionsMenu在onResume之后被调用。 - Ersen Osman
1个回答

4
我已经使用onPrepareOptionsMenu来实现你正在尝试做的事情。(未经测试但应该能给你一个想法。)
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();
}

为什么onPrepareOptionsMenu方法返回void;我刚看到一只小猫;吓死我了。 - DJphy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接