在 AppBarLayout 的 Toolbar 下制作 SwipeRefreshLayout

Make SwipeRefreshLayout under Toolbar in AppBarLayout

我使用 SwipeRefreshLayout 作为布局的根元素,因为我需要刷新屏幕上的 所有内容 。布局如下:

<SwipeRefreshLayout>
    <CoordinatorLayout>
        <ViewPager />
        <AppBarLayout>
            <Toolbar />
            <FrameLayout>
                ...
            </FrameLayout>
        <TabLayout />
    </CoordinatorLayout>
</SwipeRefreshLayout>

当我在布局上向下滑动时,SwipeRefreshLayout 的刷新圆圈从屏幕顶部出现在 Toolbar 的顶部。所以我使用 SwipeRefreshLayout#setProgressViewOffset 使圆圈从工具栏高度的偏移量开始,但是当刷新完成时,圆圈会奇怪地挂在工具栏上一会儿然后消失: screenshot

如何在工具栏下方设置刷新圈?

你的 toolbar 应该在 SwipeRefreshLayout 外面。如下操作

<CoordinatorLayout>
    <AppBarLayout>
        <Toolbar />
            <FrameLayout>
                ...
            </FrameLayout>
        <TabLayout />
    </AppBarLayout>
    <SwipeRefreshLayout>
        <NestedScrollView>
            <ViewPager />
    </SwipeRefreshLayout>
</CoordinatorLayout>

您真的要显示圆圈吗?如果你想在 FrameLayout 上显示它,你应该将 swipeRefreshLayout 放在 FrameLayout 之上,而不是将 SwipeRefreshLayout 设置为根视图。

试试这个,如果有效请告诉我。

<CoordinatorLayout>
    <NestedScrollView>
        <ViewPager />
    <AppBarLayout>
        <Toolbar />
        <SwipeRefreshLayout>
           <FrameLayout>
              ...
           </FrameLayout>
        </SwipeRefreshLayout>
    <TabLayout />
</CoordinatorLayout>

您似乎想要实现一个 coplanar indicator, as documented in the Material Design Guidelines。为此,您应该使用 setProgressViewEndTarget()setProgressViewOffset() 方法:

// This method will offset the end of the indicator animation
int target = getResources().getDimensionPixelSize(R.dimen.indicator_end_target);
mSwipeRefreshLayout.setProgressViewEndTarget(true, target);

// This method allows you to set both the start and end values for the indicator animation
int start = getResources().getDimensionPixelSize(R.dimen.indicator_start);
int end = getResources().getDimensionPixelSize(R.dimen.indicator_end);
mSwipeRefreshLayout.setProgressViewOffset(true, start, end);

通过在每个方法中将第一个参数设置为 true,指示器将在其进入视图时对其比例进行动画处理,而不是仅仅被包含视图的边缘裁剪。