我有一个FragmentActivity,它在启动时加载一个自定义ListFragment,并在单击一个项目后用一个新片段替换它。
在片段活动子类中:
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(rev 7)并将min SDK设置为API级别7(2.1)。
答案 0 :(得分:3)
完成commit()
尝试后executePendingTransactions()
。 commit()
是一个异步过程,因此可能无法立即按预期执行。
ft.commit();
getSupportFragmentManager().executePendingTransactions();