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

基本的に、ユーザーがアクティビティを開始すると、ローダーが完了するまで、アクションバーに進行状況スピナーを表示したいと考えています。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 の後に呼び出されていることに気付きました。使用できる別のライフサイクルイベントはありますか? 望ましい効果を達成するためのより良い方法はありますか?

4

1 に答える 1

3

私は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();
}
于 2013-06-20T17:46:57.043 に答える