22

我在我的應用程序下面的代碼片段:onCreateOptionsMenu的onResume後呼籲JB 4.2

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) 

加入一些破發點,我意識到onActivityCreated後onCreateOptionsMenu漸漸稱爲後。我可以使用另一個生命週期事件嗎?有沒有更好的方法來達到預期的效果?

+2

嗯,爲什麼不將你的'setActionView()'調用'onCreateOptionsMenu()',然後呢?也許根據負載是否完成而有條件地進行? – CommonsWare

+0

有點有用。看起來像'onCreateOptionsMenu'也在'onLoadFinished'之後被調用。由於我有多個加載器的標籤'hasRunningLoaders'在確定加載是否完成時沒有用處。猜猜我將不得不使用布爾值來跟蹤狀態。 – Frohnzie

+6

Android問題:http://code.google.com/p/android/issues/detail?id=39721 – Frohnzie

回答

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(); 
} 
+0

How to onPrepareOptionsMenu方法返回void;我想我剛看到一隻貓咪;嚇壞了我瘋狂的頭腦 – DJphy