在MonoDroid中使用webView.AddJavascriptInterface

时间:2011-06-28 11:43:40

标签: android xamarin.android

我正在使用MonoDroid,并希望从我的WebView中调用C#代码。

我这样做(C#):

protected override void OnCreate(Bundle bundle)
{
        [...]
        LinearLayout layout = FindViewById<LinearLayout>(Resource.Id.MyLayout);
        var webView = new WebView(this);
        webView.SetWebChromeClient(new WebChromeClient());
        webView.Settings.JavaScriptEnabled = true;
        webView.AddJavascriptInterface(new JSAccesibleObject(), "cSharpObject");
        webView.LoadUrl("file:///android_asset/test.html");
        layout.AddView(webView);
}

public class JSAccesibleObject : Java.Lang.Object
{
        public void method1()
        {

        }
}

在Javascript中,定义了cSharpObject,但它没有属性。

alert(cSharpObject); //mynamespace.Activity1_JSAccesibleObjec@f4438fe8
for (var prop in cSharpObject) 
    alert(prop); //this never gets called
alert(cSharpObject.method1) //undefined
alert(cSharpObject.method1()) //fails

我做错了什么,或者这在MonoDroid中不起作用?

2 个答案:

答案 0 :(得分:1)

A)在方法上添加[Export]属性。

B)在xamarian网站上: http://docs.xamarin.com/android/recipes/Controls/WebView/Call_C%23_from_JavaScript

C)在.java文件中编写JavaScriptInterface类型,包含.java 使用AndroidJavaSource Build操作在项目中的文件,并在Activity1.OnCreate()中执行:

IntPtr JavaScriptInterface_Class = JNIEnv.FindClass ("the/package/for/JavaScriptInterface");
// TODO: Update "the/package/for" as appropriate for your type.
IntPtr JavaScriptInterface_ctor = JNIEnv.GetMethodID (JavaScriptInterface_Class, "<init>", "()V");
IntPtr instance = JNIEnv.NewObject (JavaScriptInterface_Class, JavaScriptInterface_ctor);

appView.AddJavascriptInterface (new Java.Lang.Object (instance), "Android");

答案 1 :(得分:0)

您可能希望查看为JSAccesibleObject类生成的Java桥代码。查看\ obj \ Debug \ android \ src,看看那里有哪种方法/属性。这些应该是可以从Java调用的方法。