Фрагмент уже добавлен с помощью SwipeRefreshLayout

Это странная ошибка, с которой я сейчас борюсь.

У меня есть действие, которое отображает фрагмент поиска после завершения инициализации. Фрагмент поиска содержит представление списка для отображения результатов, и это представление списка находится внутри SwipeRefreshLayout, чтобы пользователь мог обновить результаты поиска.

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

У меня есть такое поведение, что если они используют обновление смахивания при первом открытии фрагмента, оно работает должным образом. Однако, если они отклонят фрагмент поиска, а затем снова откроют его, а затем проведут пальцем вниз для обновления, я получу исключение java.lang.IllegalStateException: Fragment already added для фрагмента поиска.

Код для ввода фрагмента поиска в первый раз:

@Override
protected void onPostExecute(Void empty) {
    dismissSearchProgress();
    getFragmentManager().beginTransaction().
        setCustomAnimations(R.animator.slide_in_left, 0, 0, R.animator.slide_out_left).
        add(R.id.main_vwContent, mWoSearchFragment).commit();
}

Во второй раз код вводится путем смахивания по экрану:

case MotionEvent.ACTION_UP:
    if (swipeInRange) {
        /* do some other stuff */
        getFragmentManager().beginTransaction().setCustomAnimations(R.animator.slide_in_left, 0, 0, R.animator.slide_out_left).add(R.id.main_vwContent, mWoSearchFragment).commit();
    }
    break;

Во втором экземпляре не возникает ошибок, если они не смахивают вниз для обновления. Ошибка возникает перед срабатыванием события onRefresh.

У кого-нибудь есть идеи? Не уверен, какой код пытается снова добавить фрагмент поиска, поскольку исключение не содержит моего кода в трассировке стека, а отладчик ничего не улавливает.


person Moth    schedule 02.07.2016    source источник


Ответы (1)


Удивительно, что написание задачи сделает для вас. Проблема заключалась в том, что для открытия фрагмента пользователь должен был провести пальцем из определенного места на экране. Итак, на MotionEvent.ACTION_DOWN мы проверяем, запустились ли они в целевой области, и устанавливаем флаг. Затем на MotionEvent.ACTION_UP добавляется фрагмент. Однако в случае SwipeRefreshLayout он перехватывает событие «MotionEvent.ACTION_DOWN», однако подталкивает «MotionEvent.ACTION_UP» вверх по стеку.

Таким образом, в моем случае флаг все еще был установлен в значение true, поскольку последним действием, предпринятым перед обновлением, было смахивание, чтобы добавить фрагмент.

Исправление заключалось в том, чтобы флаг сбрасывался в значение false при добавлении фрагмента поиска.

person Moth    schedule 02.07.2016