如何捕获Android WebView中的元素滚动

Art*_*tem 4 javascript android webview swiperefreshlayout

我有一个SwipeRefreshLayout视图作为父视图。在它里面,我正在使用加载网页的webview。我想通过下拉SwipeRefreshLayout重新加载Webview。这是我的xml:

<android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

</android.support.v4.widget.SwipeRefreshLayout>
Run Code Online (Sandbox Code Playgroud)

和Java代码:

mWebView = (WebView) view.findViewById(R.id.webView);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl("http://kashirskoe.vegas-city.ru/renter/");

mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh_layout);
    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            mSwipeRefreshLayout.setRefreshing(true);
            mSwipeRefreshLayout.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mWebView.reload();
                    mSwipeRefreshLayout.setRefreshing(false);
                }
            }, 1000);
        }
    });
Run Code Online (Sandbox Code Playgroud)

第一次脸红时效果很好。但是,当用户向下滚动时(例如,网页上的地图控件),它不会滚动。代替此SwipeRefreshLayout截取滚动并刷新网页(示例页面URL在代码上)。

当页面上的任何Web控件滚动时,我想禁用SwipeRefreshLayout滚动。就像它在浏览器Google Chrome中一样。

我想我需要在webview中注入并执行JavaScript,以便检测页面上任何滚动控件上的滚动事件。并将其传递给android本机代码。我知道如何将其传递给本机代码。

但是,如何在JavaScript中检测到此滚动事件?

Pol*_*zio 6

您可以通过定义扩展WebView的自定义WebView类并在onOverScrolled此处覆盖doc方法来检测WebView的内容是否正在滚动。

从禁用SwipeRefreshLayout开始,并在WebView中的内容不滚动时启用它。然后,您可以通过捕获WebView上发生的touch DOWN事件来检测滚动手势的开始。

public class MyWebView extends WebView{
    @Override
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);

        if( clampedX || clampedY ){
            //Content is not scrolling
            //Enable SwipeRefreshLayout
            ViewParent parent = this.getParent();
            if ( parent instanceof SwipeRefreshLayout) {
                ((SwipeRefreshLayout)parent).setEnabled(true);
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        if(event.getActionMasked()==MotionEvent.ACTION_DOWN){
            //Disable SwipeRefreshLayout
            ViewParent parent = this.getParent();
            if ( parent instanceof SwipeRefreshLayout) {
                ((SwipeRefreshLayout)parent).setEnabled(false);
            }
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)