片段已使用 SwipeRefreshLayout 添加

Fragment already added with SwipeRefreshLayout

这是一个奇怪的错误,我目前正在与它作斗争。

我有一个 activity 在完成初始化后显示搜索片段。搜索片段包含一个用于显示结果的列表视图,该列表视图位于 SwipeRefreshLayout 内,以便用户可以刷新搜索结果。

如果用户从列表中选择一个项目,则删除搜索片段并显示父 activity(它还有其他片段)。用户可以根据需要选择打开搜索片段并刷新结果。

我的行为是,如果他们在首次打开片段时使用滑动刷新,它会按预期工作。但是,如果他们关闭搜索片段然后再次打开它然后向下滑动以进行刷新,我会为搜索片段抛出 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 事件触发之前抛出错误。

有人有什么想法吗?不确定是什么代码试图再次添加搜索片段,因为异常在堆栈跟踪中没有我的任何代码并且调试器没有捕获任何东西。

写一个问题对你有什么好处真是太神奇了。问题是要打开片段,用户必须从特定屏幕位置滑动。因此,在 MotionEvent.ACTION_DOWN 上,我们检查它们是否已在目标区域内启动并设置标志。然后在 'MotionEvent.ACTION_UP' 添加片段。但是,在 SwipeRefreshLayout 的情况下,它会拦截 'MotionEvent.ACTION_DOWN' 事件,但是会将 'MotionEvent.ACTION_UP' 推到堆栈上。

所以在我的例子中,标志仍然设置为 true,因为在刷新之前执行的最后一个操作是滑动以添加片段。

修复是为了确保在添加搜索片段时将标志重置为 false。