2012-04-02 105 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