片段已添加SwipeRefreshLayout

时间:2016-07-02 23:33:56

标签: android android-fragments 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事件触发之前抛出错误。

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

1 个答案:

答案 0 :(得分:0)

写一个问题会给你带来什么了不起。问题是要打开用户必须从特定屏幕位置滑动的片段。因此,在MotionEvent.ACTION_DOWN上,我们检查它们是否已在目标区域内启动并设置标志。然后在' MotionEvent.ACTION_UP'片段被添加。但是,在SwipeRefreshLayout的情况下,它拦截了' MotionEvent.ACTION_DOWN'然而,它推动了' MotionEvent.ACTION_UP'堆栈。

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

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