Xamarin Android WebView执行JS报错:缺少resultCallback参数
解决Android WebView中EvaluateJavascript缺少resultCallback的问题
别着急,咱们一步步拆解这个问题,你遇到的报错核心是EvaluateJavascript必须传入回调实例,哪怕你不需要处理返回结果也不能省略,下面是具体的修复方案:
1. 先确保IValueCallback的正确实现(针对Xamarin.Android场景)
你的报错提示缺少resultCallback实参,说明调用时没传入符合要求的回调对象。先把回调类写对,注意必须继承Java.Lang.Object才能和Android的Java层兼容:
public class JsResultCallback : Java.Lang.Object, IValueCallback { public void OnReceiveValue(Java.Lang.Object value) { // 这里可以处理JS返回的结果,不需要的话留空也可以 if (value != null) { string jsResult = value.ToString(); Console.WriteLine("JS执行返回:" + jsResult); } } }
2. 正确调用EvaluateJavascript的姿势
在MotionEventAction.Down的事件处理里,必须把刚才写的回调实例传进去,不能省略这个参数:
// 假设你的WebView实例是webView webView.EvaluateJavascript("你的JS函数名()", new JsResultCallback());
如果完全不需要处理JS的返回结果,也可以写个极简的匿名回调:
webView.EvaluateJavascript("你的JS函数名()", new ValueCallbackEmptyImpl()); private class ValueCallbackEmptyImpl : Java.Lang.Object, IValueCallback { public void OnReceiveValue(Java.Lang.Object value) { // 空实现,什么都不用做 } }
3. 额外要注意的细节
- 必须在主线程调用:
EvaluateJavascript只能在UI主线程执行,如果你的触摸事件处理是在非主线程,记得切换:
webView.Post(() => { webView.EvaluateJavascript("你的JS函数名()", new JsResultCallback()); });
- 检查WebView的JS开关:先确认WebView已经开启了JavaScript支持,不然JS函数本身就跑不起来:
webView.Settings.JavaScriptEnabled = true;
完整示例代码片段
把这些整合起来,你的触摸事件处理代码应该是这样的:
// 初始化WebView时开启JS支持 webView.Settings.JavaScriptEnabled = true; // 处理触摸事件 public override bool OnTouchEvent(MotionEvent e) { if (e.Action == MotionEventActions.Down) { // 确保在主线程调用EvaluateJavascript webView.Post(() => { webView.EvaluateJavascript("executeMyJsFunction()", new JsResultCallback()); }); return true; } return base.OnTouchEvent(e); } // 回调实现类 public class JsResultCallback : Java.Lang.Object, IValueCallback { public void OnReceiveValue(Java.Lang.Object value) { if (value != null) { string result = value.ToString(); // 根据业务需求处理返回结果 Console.WriteLine("JS执行结果:" + result); } } }
核心就是EvaluateJavascript的第二个参数是必填项,哪怕是空实现的回调也不能省略,这样就能解决你遇到的参数缺失问题了。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

