我有一个fragmentactivity,它在启动时加载一个自定义的listframent,并在单击某个项后用一个新的片段替换它。
在片段活动子类中:

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兼容库中的一个bug吗?
我正在使用最新版本的acl(rev 7),并将min sdk设置为api级别7(2.1)。

最佳答案

完成commit()后,尝试executePendingTransactions()commit()是一个异步进程,因此可能无法按预期立即执行。

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

07-24 09:50
查看更多