Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.android 在Android网络视图中从JavaScript调用C#_Xamarin.android_Xamarin_Xamarin Studio - Fatal编程技术网

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。固定的。