Фрагмент addToBackStack вылетает приложение - PullRequest
2 голосов
/ 02 апреля 2012

У меня есть FragmentActivity, которое загружает один пользовательский ListFragment при запуске и заменяет его новым фрагментом после нажатия элемента.

В подклассе активности фрагмента:

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

Inобработчик элемента списка в подклассе 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 я в любом случае явно вызываю метод cancelLoad () CursorLoader.

Есть мысли о том, как это исправить?Это ошибка в библиотеке совместимости Android?

Я использую последнюю версию ACL (версия 7), и для min SDK задан уровень API 7 (2.1).

1 Ответ

3 голосов
/ 02 апреля 2012

После того, как вы выполните commit(), попробуйте executePendingTransactions().commit() - это асинхронный процесс, поэтому он может выполняться не сразу, как вы ожидали.

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