Android Xamarin 中的 WebView.EvaluateJavaScript 问题
Issue with WebView.EvaluateJavaScript in Android Xamarin
我正在使用以下代码将 Java 脚本注入我的 Android Web 视图
WebView
webView = FindViewById<WebView> (Resource.Id.learningWebView);
if (null != webView) {
webView.Settings.JavaScriptEnabled = true;
webView.Settings.SetSupportZoom (true);
webView.SetWebViewClient (new CustomWebViewClient ());
}
WebView 客户端实现
public class CustomWebViewClient : WebViewClient
{
public override bool ShouldOverrideUrlLoading (WebView view, string url)
{
view.LoadUrl (url);
return true;
}
public override void OnPageStarted (WebView view, string url, Android.Graphics.Bitmap favicon)
{
}
public override void OnPageFinished (WebView view, string url)
{
base.OnPageFinished (view, url);
HideLearningDivs (view);
}
void HideLearningDivs (WebView view)
{
try {
view.EvaluateJavascript ("document.getElementById(\"suiteBar\").parentNode.style.display='none'", new JavaScriptResult ());
} catch (Exception ex) {
Console.WriteLine (ex.Message);
}
}
IValueCallback 实现
public class JavaScriptResult : IValueCallback
{
public IntPtr Handle {
get;
set;
}
public void Dispose ()
{
}
public void OnReceiveValue (Java.Lang.Object result)
{
}
}
但是在执行应用程序时出现以下错误。
java.lang.NoSuchMethodError: [=44= 中没有名称='evaluateJavascript' signature='(Ljava/lang/String;Landroid/webkit/ValueCallback;)V' 的方法] Landroid/webkit/WebView;
谁能帮我找出我的实现有什么问题。
我会 link 到我在下面找到答案的地方,但基本上你需要检查 Android KitKat (4.4),因为那个功能直到那时才被引入。如果设备 运行 低于 4.4,那么如果您确实需要对它执行某些操作,则可能需要执行一些不同的操作才能取回该值。例如使用某种 Hybrid WebView
(也许可以查看它的 Xamarin Forms Labs 版本)and/or 使用 AddJavaScriptInterface()
代码如下:
if(Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Kitkat) {
webView.EvaluateJavascript("javascript:GoBack();", null);
} else {
webView.LoadUrl("javascript:GoBack();");
}
https://forums.xamarin.com/discussion/24894/webview-evaluatejavascript-issues
*编辑:自从写这篇文章以来,我发现了一个 excellent post Adam Pedley(我显然最近经常 linking),它涵盖了为 Xamarin Forms 做这件事,但也提到了一个变化Android 4.2 到 JS 引擎。 运行 JavaScript 可能第一次工作,但它也会将文档对象设置为脚本结果,因此您可能需要将 document.getElementById()
的结果分配给变量才能变通这个:var x = document.getElementById()
.
JavaScriptResult
class 必须继承自 Java.Lang.Object
,像这样:
public class JavaScriptResult : Java.Lang.Object, IValueCallback
{
public void OnReceiveValue(Object value)
{
// ...
}
}
我正在使用以下代码将 Java 脚本注入我的 Android Web 视图
WebView
webView = FindViewById<WebView> (Resource.Id.learningWebView);
if (null != webView) {
webView.Settings.JavaScriptEnabled = true;
webView.Settings.SetSupportZoom (true);
webView.SetWebViewClient (new CustomWebViewClient ());
}
WebView 客户端实现
public class CustomWebViewClient : WebViewClient
{
public override bool ShouldOverrideUrlLoading (WebView view, string url)
{
view.LoadUrl (url);
return true;
}
public override void OnPageStarted (WebView view, string url, Android.Graphics.Bitmap favicon)
{
}
public override void OnPageFinished (WebView view, string url)
{
base.OnPageFinished (view, url);
HideLearningDivs (view);
}
void HideLearningDivs (WebView view)
{
try {
view.EvaluateJavascript ("document.getElementById(\"suiteBar\").parentNode.style.display='none'", new JavaScriptResult ());
} catch (Exception ex) {
Console.WriteLine (ex.Message);
}
}
IValueCallback 实现
public class JavaScriptResult : IValueCallback
{
public IntPtr Handle {
get;
set;
}
public void Dispose ()
{
}
public void OnReceiveValue (Java.Lang.Object result)
{
}
}
但是在执行应用程序时出现以下错误。
java.lang.NoSuchMethodError: [=44= 中没有名称='evaluateJavascript' signature='(Ljava/lang/String;Landroid/webkit/ValueCallback;)V' 的方法] Landroid/webkit/WebView;
谁能帮我找出我的实现有什么问题。
我会 link 到我在下面找到答案的地方,但基本上你需要检查 Android KitKat (4.4),因为那个功能直到那时才被引入。如果设备 运行 低于 4.4,那么如果您确实需要对它执行某些操作,则可能需要执行一些不同的操作才能取回该值。例如使用某种 Hybrid WebView
(也许可以查看它的 Xamarin Forms Labs 版本)and/or 使用 AddJavaScriptInterface()
代码如下:
if(Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Kitkat) {
webView.EvaluateJavascript("javascript:GoBack();", null);
} else {
webView.LoadUrl("javascript:GoBack();");
}
https://forums.xamarin.com/discussion/24894/webview-evaluatejavascript-issues
*编辑:自从写这篇文章以来,我发现了一个 excellent post Adam Pedley(我显然最近经常 linking),它涵盖了为 Xamarin Forms 做这件事,但也提到了一个变化Android 4.2 到 JS 引擎。 运行 JavaScript 可能第一次工作,但它也会将文档对象设置为脚本结果,因此您可能需要将 document.getElementById()
的结果分配给变量才能变通这个:var x = document.getElementById()
.
JavaScriptResult
class 必须继承自 Java.Lang.Object
,像这样:
public class JavaScriptResult : Java.Lang.Object, IValueCallback
{
public void OnReceiveValue(Object value)
{
// ...
}
}