我使用以下代码将Java Script注入我的Android Web视图
web视图
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:在类Landroid / webkit / WebView中没有name ='evaluateJavascript'cignal ='(Ljava / lang / String; Landroid / webkit / ValueCallback;)V'的方法;
任何人都可以帮我找一下我的实施方法。
答案 0 :(得分:1)
我将链接到我在下面找到答案的位置,但基本上你需要检查Android KitKat(4.4),因为直到那时才引入该功能。如果设备运行低于4.4,那么如果您确实需要对其进行操作,则可能需要执行不同的操作以获取值。例如使用某种Hybrid WebView
(或许查看Xamarin Forms Labs版本)和/或使用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(我显然已经链接到很多人),其中包括为Xamarin Forms执行此操作,但也提到了Android 4.2到JS引擎的更改。运行JavaScript可能是第一次运行,但它也将文档对象设置为脚本结果,因此您可能需要将document.getElementById()
的结果分配给变量以解决此问题:var x = document.getElementById()
。
答案 1 :(得分:0)
JavaScriptResult
类必须继承自 Java.Lang.Object
,如下所示:
public class JavaScriptResult : Java.Lang.Object, IValueCallback
{
public void OnReceiveValue(Object value)
{
// ...
}
}