滚动位置位于顶部时,SwipeRefreshLayout + WebView

eug*_*ene 26 android webview swiperefreshlayout

我正在尝试将SwipeRefreshLayout与WebView一起使用.

我正面临着问题,在页面中间,当用户向下滚动时,不必要的刷新开始.

如何在webview的滚动位置位于顶部时才进行刷新事件.(即,他正在查看页面的顶部)?

viz*_*izZ 28

我设法解决它而不必扩展任何东西.看看这个片段(片段特定):

private ViewTreeObserver.OnScrollChangedListener mOnScrollChangedListener;

@Override
public void onStart() {
    super.onStart();

    swipeLayout.getViewTreeObserver().addOnScrollChangedListener(mOnScrollChangedListener =
            new ViewTreeObserver.OnScrollChangedListener() {
                @Override
                public void onScrollChanged() {
                    if (mWebView.getScrollY() == 0)
                        swipeLayout.setEnabled(true);
                    else
                        swipeLayout.setEnabled(false);

                }
            });
}

@Override
public void onStop() {
    swipeLayout.getViewTreeObserver().removeOnScrollChangedListener(mOnScrollChangedListener);
    super.onStop();
}
Run Code Online (Sandbox Code Playgroud)

有关更广泛的背景,请查看我对Android的回答- 使用空textview的SwipeRefreshLayout.

  • 穷人的一行(带有lambda):`swipeLayout.getViewTreeObserver().addOnScrollChangedListener(() - > swipeLayout.setEnabled((webView.getScrollY()== 0)));` (3认同)
  • Kotlin 的免费一个衬垫`swipeRefreshLayout.isEnabled = webView.scrollY == 0` (2认同)

hiB*_*Lee 20

我认为推荐的方法是扩展SwipeRefreshLayout和覆盖canChildScrollUp()- https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html#canChildScrollUp()

这就是在Google IO 2014计划应用中完成的操作 - https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget /MultiSwipeRefreshLayout.java#L76

CustomSwipeRefreshLayout可能会是这样的:

public class CustomSwipeRefreshLayout extends SwipeRefreshLayout {

    private CanChildScrollUpCallback mCanChildScrollUpCallback;

    public interface CanChildScrollUpCallback {
        boolean canSwipeRefreshChildScrollUp();
    }

    public void setCanChildScrollUpCallback(CanChildScrollUpCallback canChildScrollUpCallback) {
        mCanChildScrollUpCallback = canChildScrollUpCallback;
    }

    @Override
    public boolean canChildScrollUp() {
        if (mCanChildScrollUpCallback != null) {
            return mCanChildScrollUpCallback.canSwipeRefreshChildScrollUp();
        }
        return super.canChildScrollUp();
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的Activity那个有WebView,

public class FooActivity
        implements CustomSwipeRefreshLayout.CanChildScrollUpCallback {

    private CustomSwipeRefreshLayout mRefreshLayout;
    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // after initialization
        mRefreshLayout.setCanChildScrollUpCallback(this);
    }

    @Override
    public boolean canSwipeRefreshChildScrollUp() {
        return mWebview.getScrollY() > 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • mWebView.getScrollY对我来说总是0. (2认同)
  • @petrnohejl 但是如果我们加载其他网站怎么办?我们无法控制其他网站,因此这不是一个全球解决方案 (2认同)

Pra*_*nav 8

只要实现你的FragmentActivityViewTreeObserver.OnScrollChangedListener再设置监听像webview.getViewTreeObserver().addOnScrollChangedListener(this);

onScrollChanged()方法中这样做

    @Override
    public void onScrollChanged() {
        if (webview.getScrollY() == 0) {
            swipeLayout.setEnabled(true);
        } else {
            swipeLayout.setEnabled(false);
        }
    }
Run Code Online (Sandbox Code Playgroud)


Ale*_*xey 5

支持库的最新版本具有SwipeRefreshLayout#setOnChildScrollUpCallback允许您避免子类化的方法SwipeRefreshLayout

mBinding.swipeRefreshLayout.setOnChildScrollUpCallback((parent, child) -> 
            mBinding.webView.getScrollY() > 10);
Run Code Online (Sandbox Code Playgroud)


Isa*_*aac 2

您可以通过使用接受 WebView 并使用 WebView 检查滚动位置的自定义 SwipeRefreshLayout 扩展 SwipeRefreshLayout 来解决此问题。

注意:这适用于滚动整个页面,但可能不适用于嵌套滚动。另外,如果您有水平滚动,您可能还想添加此答案中找到的逻辑: https: //stackoverflow.com/a/24453194

public class CustomSwipeToRefresh extends SwipeRefreshLayout {

    private final int yScrollBuffer = 5;
    private WebView mWebView;

    public CustomSwipeToRefresh(Context context, WebView webView) {
        super(context);

        mWebView = webView;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (mWebView.getScrollY() > yScrollBuffer)
            return false;

        return super.onInterceptTouchEvent(event);
    }
}
Run Code Online (Sandbox Code Playgroud)