Use*_*382 5 xamarin.android xamarin
我正在使用Xamarin Android开发一个应用程序,它有一个显示网页的WebView.我想实现从WebView到c#的Javascript之间的双向通信.我可以使用此链接从Javascript调用C#.但是我找不到将数据从C#发送回Javascript的方法.有没有办法在这种方法中来回发送数据.我认为在Javascript中编写回调会起作用,但是如何从C#代码中激活它.
现在,我的问题是如何从javascript接口类调用WebView.我有一个Javascript接口类,如https://developer.xamarin.com/recipes/android/controls/webview/call_csharp_from_javascript/ namespace ScannerAndroid {public class JSInterface:Java.Lang.Object {Context context; 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');");
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码在LoadUrl行抛出异常.java.lang.Throwable:在线程'Thread-891'上调用了一个WebView方法.必须在同一个线程上调用所有WebView方法.(预期的Looper Looper(main,tid 1){42ce58a0}调用null,FYI主Looper是Looper(main,tid 1){42ce58a0})
现在我正在努力如何从这个Java脚本接口类引用WebView
是的。这是可能的。如果您的目标是 KitKat 或更高版本,您可以使用:
webView.EvaluateJavascript("enable();", null);
Run Code Online (Sandbox Code Playgroud)
本例中enable();是一个 JS 函数。
如果您的目标是较低的 API 级别,您可以使用LoadUrl();:
webView.LoadUrl("javascript:enable();");
Run Code Online (Sandbox Code Playgroud)
编辑:
你在它抱怨的地方得到的错误LoadUrl是因为它由于某种原因发生在非 UI 线程上。
由于您已经将 传递到ContextJavascriptInterface 类中,因此您可以简单地将 的内容包装ShowToast在:
context.RunOnUiThread(() => {
// stuff here
});
Run Code Online (Sandbox Code Playgroud)
只需将签名从 更改Context为Activity,它应该可以帮助您将您重新编组回 UI 线程。
| 归档时间: |
|
| 查看次数: |
2911 次 |
| 最近记录: |