2012-04-02 146 views
2

我有一個FragmentActivity在啓動時加載一個自定義ListFragment,並在單擊項目後用新片段替換它。片段addToBackStack崩潰應用

在片段活動的子類:

public void onCreate(Bundle savedInstanceState) { 
     ... 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.add(R.id.list_activity, listFragment, "venueListFragment"); 
     ft.commit(); 
     ... 
} 

在ListFragment子類中的列表項的處理程序:

public void onListItemClick(ListView l, View v, int position, long id) { 

    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, android.R.anim.slide_in_left, android.R.anim.slide_out_right); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 

    VenueListFragment newFragment = VenueListFragment.newInstance(nextListType, nextRowID); 

    ft.replace(R.id.list_activity, newFragment, "venueListFragment"); 
     ft.addToBackStack(null);     
    ft.commit(); 
} 

這第一片段後工作正常,但是當我試着點擊了項目在第二個片段中,我從內部FragmentManager類中得到此錯誤:

04-03 01:04:24.999: E/AndroidRuntime(15016): FATAL EXCEPTION: main 
04-03 01:04:24.999: E/AndroidRuntime(15016): java.lang.NullPointerException 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.support.v4.app.LoaderManagerImpl.hasRunningLoaders(LoaderManager.java:824) 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082) 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622) 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420) 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.os.Handler.handleCallback(Handler.java:587) 

我注意到,如果我註釋掉addToBackStack,下一個片段加載正常,但是因此我無法再向後導航。另外,如果我在點擊下一個列表項前簡單等待5-7秒,應用程序不會崩潰,但片段中的光標加載器會以比此更早的加載方式完成加載,因爲整個列表已經可見。在onDestroyView中,我總是明確調用CursorLoader的cancelLoad()方法。

有關如何解決這個問題的任何想法?這是Android兼容庫中的一個錯誤嗎?

我正在使用最新版本的ACL(第7版)並將min SDK設置爲API級別7(2.1)。

回答

3

當你做了commit()嘗試executePendingTransactions()commit()是一個異步進程,因此可能無法按預期立即執行。

ft.commit(); 
getSupportFragmentManager().executePendingTransactions(); 
+0

你是一個救星! – oohaba 2012-04-03 04:32:17