You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:WebView的OnScrollChange事件未触发,已完成接口实现与设置

解决WebView滚动监听OnScrollChange不触发的问题

我之前也碰到过一模一样的问题!咱们来一步步排查和解决:

首先排查最常见的几个坑

1. 检查Android系统版本是否达标

WebView.SetOnScrollChangeListener是**Android 6.0(API 23)**才引入的API,如果你的测试设备系统版本低于6.0,这个方法根本不会生效。你可以在项目的AndroidManifest.xml里确认minSdkVersion的设置,同时检查测试设备的系统版本。

2. 确认WebView内容确实可以滚动

如果WebView加载的内容高度没有超过屏幕高度,自然不会触发滚动事件。建议先加载一个长内容的页面(比如维基百科的长词条)测试,确保内容能滚动。

3. 检查接口实现的写法

你用了显式接口实现的方式:void WebView.IOnScrollChangeListener.OnScrollChange(...),这种写法本身没问题,但有时候在Xamarin里可能会有隐式的绑定问题。可以试试改成隐式实现,代码如下:

public class MainActivity : Activity, WebView.IOnScrollChangeListener
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);
        
        WebView webView = FindViewById<WebView>(Resource.Id.webView);
        webView.SetOnScrollChangeListener(this);
        // 加载长内容测试
        webView.LoadUrl("https://en.wikipedia.org/wiki/Xamarin");
    }

    // 改成隐式实现接口方法
    public void OnScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY)
    {
        Log.Info("101028", "scrolled??");
    }
}

兼容性更好的替代方案(适配所有API版本)

如果你的App需要兼容API 23以下的设备,或者上面的方法还是不生效,推荐自定义WebView,重写OnScrollChanged方法来实现滚动监听,兼容性更强:

第一步:创建自定义WebView类

using Android.Content;
using Android.Runtime;
using Android.Util;
using Android.Webkit;
using Android.Views;

public class ScrollableWebView : WebView
{
    // 定义自定义滚动事件
    public event EventHandler<ScrollChangedEventArgs> ScrollChanged;

    public ScrollableWebView(Context context) : base(context) { }
    public ScrollableWebView(Context context, IAttributeSet attrs) : base(context, attrs) { }
    public ScrollableWebView(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr) { }
    public ScrollableWebView(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { }

    protected override void OnScrollChanged(int scrollX, int scrollY, int oldScrollX, int oldScrollY)
    {
        base.OnScrollChanged(scrollX, scrollY, oldScrollX, oldScrollY);
        // 触发自定义事件
        ScrollChanged?.Invoke(this, new ScrollChangedEventArgs(scrollX, scrollY, oldScrollX, oldScrollY));
    }
}

// 自定义事件参数类
public class ScrollChangedEventArgs : EventArgs
{
    public int ScrollX { get; }
    public int ScrollY { get; }
    public int OldScrollX { get; }
    public int OldScrollY { get; }

    public ScrollChangedEventArgs(int scrollX, int scrollY, int oldScrollX, int oldScrollY)
    {
        ScrollX = scrollX;
        ScrollY = scrollY;
        OldScrollX = oldScrollX;
        OldScrollY = oldScrollY;
    }
}

第二步:在布局和Activity中使用

在你的布局文件(比如Main.axml)里替换原来的WebView为自定义的ScrollableWebView:

<yournamespace.ScrollableWebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

然后在Activity中绑定事件:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    SetContentView(Resource.Layout.Main);
    
    ScrollableWebView webView = FindViewById<ScrollableWebView>(Resource.Id.webView);
    webView.ScrollChanged += (sender, e) =>
    {
        Log.Info("101028", $"Scrolled - X: {e.ScrollX}, Y: {e.ScrollY}");
    };
    webView.LoadUrl("https://en.wikipedia.org/wiki/Xamarin");
}

这个方案不管是低版本还是高版本Android系统都能正常工作,而且滚动事件触发更稳定。

内容的提问来源于stack exchange,提问作者Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:57:15