Android监听WebView滑动到底部的两种方式

本文介绍了两种方法监控WebView滚动:自定义onScrollChanged接口和注入JavaScript。第一种适用于原生WebView,第二种适用于兼容性较差的情况,如X5WebView。同时提及了常见问题和前端配合技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种方式:自定义webView,实现onScrollChanged方法,通过接口的方式暴露出去。

public class ScrollChangeLisWebView extends WebView {
    public ScrollChangeLisWebView(Context context) {
        super(context);
    }

    //实时滑动监控
    //参数l代表滑动后当前位置,old代表原来原值
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        mScrollInterface.onSChanged(l, t, oldl, oldt);
    }

    public ScrollInterface mScrollInterface;

    //监控滑动
    public void setOnCustomScrollChangeListener(ScrollInterface scrollInterface) {
        this.mScrollInterface = scrollInterface;
    }
    public interface ScrollInterface {
        public void onSChanged(int l, int t, int oldl, int oldt);
    }

}

使用:

 webView.setOnCustomScrollChangeListener(new ScrollChangeLisWebView.ScrollInterface() {
        @Override
        public void onSChanged(int l, int t, int oldl, int oldt) {
            //WebView的总高度  有缩放比例
            float webViewContentHeight = webView.getContentHeight() * webView.getScale();
            //WebView的现高度
            float webViewCurrentHeight = (webView.getHeight() + webView.getScrollY());
            if ((webViewContentHeight - webViewCurrentHeight) < 10) {  //尽量不要用==0,有时候精度问题导致无法完全相等(自己调试即可)  
              // 已经处于底端
              //.....
            }
        }
    });

常见的坑:
1.如果前端页面height写成100%,会导致webView.getScrollY()一直为0,这个我没碰到,百度有看到别人出现这种;如果出现这种,找前端沟通调整即可。

2.由于原生WebView兼容性很差,如果使用腾讯的X5WebView,webView.getScrollY()也会一直为0,这时候使用webView.getWebScrollY()即可,这种我碰到了。

第二种方式:注入js

  webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView webView, String s) {
                super.onPageFinished(webView, s);
                //滑动监听
                String startSave = "\n" +
                        "document.getElementById(\"page-container\").addEventListener('scroll',function () {\n" +
                        "console.log(this.scrollHeight);\n" +
                        "console.log(this.scrollTop);\n" +
                        "console.log(this.clientHeight);\n" +
                        "if(this.scrollHeight-this.scrollTop - this.clientHeight < 50){\n" +
//                      "if(this.scrollHeight-this.scrollTop == this.clientHeight){\n" +     精度计算问题   会有一点误差  无法相等
                        "console.log(\"到达底部\");\n" +
                        "window.java.open(\"到达底部\"); \n" +
                        "}\n" +
                        "});";
                //注入
                webView.loadUrl("javascript:" + startSave);
            }
        });
        
        //注入、反射
        webView.addJavascriptInterface(new Object() {
            @JavascriptInterface
            public void open(String msg) {//滑动到底端
				//.....
				//这里更新UI失败的话,可以用runOnUiThread或者webView.post(new Runnable() {}
            }
        }, "java");

注入js的方式需要与前端约定好调用方法,比如page-container就是前端页面的一个标签。
可以网页上直接拿代码调试即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值