【问题标题】:Fragment addToBackStack crashes app片段 addToBackStack 使应用程序崩溃
【发布时间】:2012-04-03 03:21:56
【问题描述】:

我有一个 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(修订版 7)并将最小 SDK 设置为 API 级别 7 (2.1)。

【问题讨论】:

    标签: android android-fragments android-support-library


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 2014-03-08
      • 2018-08-26
      • 1970-01-01
      • 2016-08-05
      • 2012-12-17
      相关资源
      最近更新 更多