我正在使用 Xamarin Android 开发一个应用程序,它有一个显示网页的 WebView。我想实现从 WebView 到 C# 的 Javascript 之间的双向通信。我可以使用这个从 Javascript 调用 C#link。但是我找不到将数据从 C# 发送回 Javascript 的方法。
有没有办法以这种方法来回发送数据。我认为用 Javascript 编写回调会起作用,但是如何从 C# 代码中触发它。
现在,我的问题是如何从 javascript 接口类调用 WebView。我有一个如上所述的 Javascript 接口类https://developer.xamarin.com/recipes/android/controls/webview/call_csharp_from_javascript/命名空间扫描器Android
{
公共类 JSInterface: Java.Lang.Object
{
上下文上下文;
WebView webView;
public JSInterface (Context context, WebView webView1)
{
this.context = context;
this.webView = webView1;
}
[Export]
[JavascriptInterface]
public void ShowToast()
{
Toast.MakeText (context, "Hello from C#", ToastLength.Short).Show ();
this.webView.LoadUrl ("javascript:callback('Hello from Android Native');");
}
}
}
该代码在 LoadUrl 行引发异常。 java.lang.Throwable:在线程“Thread-891”上调用了 WebView 方法。所有 WebView 方法必须在同一线程上调用。 (预期的 Looper Looper (main, tid 1) {42ce58a0} 在 null 上调用,仅供参考,main Looper 是 Looper (main, tid 1) {42ce58a0})
现在我正在努力如何从这个Java脚本接口类引用WebView
是的。这是可能的。如果您的目标是 KitKat 或更高版本,您可以使用:
webView.EvaluateJavascript("enable();", null);
在这种情况下哪里enable();
是一个JS函数。
如果您的目标是较低的 API 级别,您可以使用LoadUrl();
:
webView.LoadUrl("javascript:enable();");
EDIT:
你在抱怨的地方得到的错误LoadUrl
是因为由于某种原因它发生在非 UI 线程上。
既然你已经传递了Context
到你的 JavascriptInterface 类中,然后你可以简单地将内容包装起来ShowToast
in:
context.RunOnUiThread(() => {
// stuff here
});
只需更改签名Context
to Activity
它应该可以帮助您重新回到 UI 线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)