Xamarin.android 在Android网络视图中从JavaScript调用C#
我想从我的Xamarin.android 在Android网络视图中从JavaScript调用C#,xamarin.android,xamarin,xamarin-studio,Xamarin.android,Xamarin,Xamarin Studio,我想从我的WebView中加载的HTML中调用一个C#类/方法 我定义了一个类JS2CS,它包含一个方法来显示Toast,如下所示: using Android.Content; using Android.Widget; using Java.Interop; namespace CrossPlatformApp_Android { public class JS2CS : Java.Lang.Object { private Context context; pu
WebView
中加载的HTML中调用一个C#类/方法
我定义了一个类JS2CS
,它包含一个方法来显示Toast
,如下所示:
using Android.Content;
using Android.Widget;
using Java.Interop;
namespace CrossPlatformApp_Android
{
public class JS2CS : Java.Lang.Object
{
private Context context;
public JS2CS (Context context)
{
this.context = context;
}
[Export ("run")]
public void Run ()
{
Toast.MakeText (context, "Hello from C#", ToastLength.Short).Show ();
}
}
}
<button type="button" onclick="JS2CS.run()" >Call C#</button>
myWebView.Settings.JavaScriptEnabled = true;
myWebView.SetWebChromeClient (new CustomWebChromeClient());
myWebView.LoadUrl ("file:///android_asset/Content/HomePage.html");
myWebView.AddJavascriptInterface (new JS2CS (this), "JS2CS");
我在我的主页.html
文件中定义了一个按钮,如下所示:
using Android.Content;
using Android.Widget;
using Java.Interop;
namespace CrossPlatformApp_Android
{
public class JS2CS : Java.Lang.Object
{
private Context context;
public JS2CS (Context context)
{
this.context = context;
}
[Export ("run")]
public void Run ()
{
Toast.MakeText (context, "Hello from C#", ToastLength.Short).Show ();
}
}
}
<button type="button" onclick="JS2CS.run()" >Call C#</button>
myWebView.Settings.JavaScriptEnabled = true;
myWebView.SetWebChromeClient (new CustomWebChromeClient());
myWebView.LoadUrl ("file:///android_asset/Content/HomePage.html");
myWebView.AddJavascriptInterface (new JS2CS (this), "JS2CS");
CustomWebChromeClient
是WebChromeClient
的简单扩展,与其父代相比不提供任何附加功能
最后,在调用LoadUrl(…)
之后,我将我的JS2CS
对象注入我的WebView
,如下所示:
using Android.Content;
using Android.Widget;
using Java.Interop;
namespace CrossPlatformApp_Android
{
public class JS2CS : Java.Lang.Object
{
private Context context;
public JS2CS (Context context)
{
this.context = context;
}
[Export ("run")]
public void Run ()
{
Toast.MakeText (context, "Hello from C#", ToastLength.Short).Show ();
}
}
}
<button type="button" onclick="JS2CS.run()" >Call C#</button>
myWebView.Settings.JavaScriptEnabled = true;
myWebView.SetWebChromeClient (new CustomWebChromeClient());
myWebView.LoadUrl ("file:///android_asset/Content/HomePage.html");
myWebView.AddJavascriptInterface (new JS2CS (this), "JS2CS");
不幸的是,这不起作用。当我启动应用程序并单击html按钮时,我会收到以下消息:
[Web控制台]未捕获引用错误:未在上定义JS2CS
file:///android_asset/Content/HomePage.html:22
如果在LoadUrl(…)
之前调用AddJavascriptInterface(…)
方法,则会收到以下错误消息:
[Web控制台]未捕获类型错误:对象[Object]没有方法
跑file:///android_asset/Content/HomePage.html:22
任何人有什么想法吗
上述实现基于以下两个URL:
嗯,在尝试了各种各样的事情之后。。。我在Android文档中偶然发现了这句话: …仅适用于API级别JELLY_BEAN_MR1及以上的应用程序 可以使用JavascriptInterface注释公共方法 从JavaScript访问 我将我的Android应用程序的目标版本从API 19降低到API 14,并且没有对问题中的代码做任何其他更改,现在它可以工作了!万岁!然而,现在这确实提出了一个问题,即如何将JavaScript接口注入应用程序针对API 17+的
WebView
,但这是另一个线程的另一个问题
编辑:要使其适用于针对API 17+的应用程序,只需将[JavascriptInterface]
注释添加到正在使用的方法中即可
出口
链接现在是谢谢Felix。固定的。