我在我的应用程序中有以下代码片段:
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之后被调用。有没有其他的生命周期事件可以使用?是否有更好的方法来实现所需的效果?
setActionView()
调用移到onCreateOptionsMenu()
中呢?或许可以根据加载是否完成来有条件地执行它? - CommonsWareonCreateOptionsMenu
在onLoadFinished
之后也会被调用。由于我有多个加载器的选项卡,因此hasRunningLoaders
无法确定加载是否已完成。猜想我将不得不使用布尔值来跟踪状态。 - Frohnzie