- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试将 monodroid 与 webkit 一起使用来创建应用程序。我在让 html 页面调用 javascript 方法时遇到问题,这将是我应用程序中方法的接口(interface)。在 http://developer.android.com/guide/webapps/webview.html 上有一个教程。有关如何在 java 中执行此操作,但相同的代码不适用于 C#。
此交换在 call monodroid method from javascript example链接了一些关于使用 JNI 来解决 monodroid 和 javascript 接口(interface)方法问题的线程,但我无法让它工作。
现在,我正在尝试使用一些代码指令,但没有成功:
// Java
class RunnableInvoker {
Runnable r;
public RunnableInvoker (Runnable r) {
this.r = r;
}
// must match the javascript name:
public void doSomething() {
r.run ();
}
}
From C#, you'd create a class that implements Java.Lang.IRunnable:
// C#
class SomeAction : Java.Lang.Object, Java.Lang.IRunnable {
Action a;
public void SomeAction(Action a) {this.a = a;}
public void Run () {a();}
}
Then to wire things up:
// The C# action to invoke
var action = new SomeAction(() => {/* ... */});
// Create the JavaScript bridge object:
IntPtr RunnableInvoker_Class = JNIEnv.FindClass("RunnableInvoker");
IntPtr RunnableInvoker_ctor = JNIEnv.GetMethodID (RunnableInvoker_Class, "<init>", "(Ljava/lang/Runnable;)V");
IntPtr instance = JNIEnv.NewObject(RunnableInvoker_Class, RunnableInvoker_ctor, new JValue (action));
// Hook up WebView to JS object
web_view.AddJavascriptInterface (new Java.Lang.Object(instance, JniHandleOwnership.TransferLocalRef), "Android");
最佳答案
让我们退后一步。您想从 JavaScript 调用 C# 代码。如果你不介意眯着眼睛,这很简单。
首先,让我们从布局 XML 开始:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<WebView
android:id="@+id/web"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
[Activity (Label = "Scratch.WebKit", MainLauncher = true)]
public class Activity1 : Activity
{
const string html = @"
<html>
<body>
<p>This is a paragraph.</p>
<button type=""button"" onClick=""Foo.run()"">Click Me!</button>
</body>
</html>";
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
WebView view = FindViewById<WebView>(Resource.Id.web);
view.Settings.JavaScriptEnabled = true;
view.SetWebChromeClient (new MyWebChromeClient ());
view.LoadData (html, "text/html", null);
view.AddJavascriptInterface(new Foo(this), "Foo");
}
}
Activity1.html
是我们要显示的 HTML 内容。唯一有趣的是我们提供了
/button/@onClick
调用 JavaScript 片段
Foo.run()
的属性.注意方法名称(“run”),它以小写的 'r' 开头;我们稍后再讨论。
view.Settings.JavaScriptEnabled=true
启用 JavaScript .没有这个,我们就无法使用 JavaScript。 view.SetWebChromeClient()
带有 MyWebChromeClient
的实例类(稍后定义)。这有点像“ cargo 崇拜编程”:如果我们不提供它,事情就不起作用;我不知道为什么。如果我们改为执行看似等效的 view.SetWebChromeClient(new WebChromeClient())
,我们在运行时得到一个错误:E/Web Console( 4865): Uncaught ReferenceError: Foo is not defined at data:text/html;null,%3Chtml%3E%3Cbody%3E%3Cp%3EThis%20is%20a%20paragraph.%3C/p%3E%3Cbutton%20type=%22button%22%20onClick=%22Foo.run()%22%3EClick%20Me!%3C/button%3E%3C/body%3E%3C/html%3E:1
view.AddJavascriptInterface()
关联 JavaScript 名称 "Foo"
类的实例 Foo
. MyWebChromeClient
类(class):
class MyWebChromeClient : WebChromeClient {
}
WebChromeClient
会更有趣。实例导致事情失败。 :-/
Foo
。上面与
"Foo"
关联的类JavaScript 变量:
class Foo : Java.Lang.Object, Java.Lang.IRunnable {
public Foo (Context context)
{
this.context = context;
}
Context context;
public void Run ()
{
Console.WriteLine ("Foo.Run invoked!");
Toast.MakeText (context, "This is a Toast from C#!", ToastLength.Short)
.Show();
}
}
Run()
时显示一条短消息方法被调用。
Java.Lang.Object
创建子类,它声明了所有被覆盖的方法和所有实现的 Java 接口(interface)。这包括上述
Foo
类,生成 Android Callable Wrapper:
package scratch.webkit;
public class Foo
extends java.lang.Object
implements java.lang.Runnable
{
@Override
public void run ()
{
n_run ();
}
private native void n_run ();
// details omitted for clarity
}
view.AddJavascriptInterface(new Foo(this), "Foo")
被调用,这没有关联 JavaScript
"Foo"
C# 类型的变量。这是关联 JavaScript
"Foo"
具有与 C# 类型的实例关联的 Android Callable Wrapper 实例的变量。 (啊,间接...)
Foo
类实现了
Java.Lang.IRunnable
接口(interface),它是
java.lang.Runnable
的 C# 绑定(bind)界面。因此,Android Callable Wrapper 声明它实现了
java.lang.Runnable
接口(interface),并声明
Runnable.run
方法。 Android 以及 Android 内的 JavaScript 不会“看到”您的 C# 类型。他们反而看到了 Android Callable Wrappers。因此,JavaScript 代码没有调用
Foo.Run()
(大写'R'),它正在调用
Foo.run()
(小写“r”),因为 Android/JavaScript 有权访问的类型声明了
run()
方法,而不是
Run()
方法。
Foo.run()
,然后是 Android Callable Wrapper
scratch.webview.Foo.run()
方法被调用,通过 JNI 的乐趣,导致执行
Foo.Run()
C# 方法,这实际上是您一开始就想做的所有事情。
run()
,或者你想要参数,或者任何数量的其他东西,你的世界会变得更加复杂(至少在 Mono for Android 4.2 和
[Export]
支持之前)。您需要做以下两件事之一:
关于javascript - Monodroid Javascript 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9745168/
我有一个奇怪的布局问题。我用 java 开发了一个应用程序,想将它移植到 C#。移植源代码没问题,但布局是。我刚刚将 layout.xml(从 java 应用程序)的内容复制到 layout.axml
我的应用程序使用标准的 .NET RESX 方法(即 String.fr.resx、Strings.de.resx 等)本地化,在 Windows Phone 下运行良好。 我正在使用 MonoDro
我是 android 开发的新手,请原谅我的无知。我只是想弄清楚如何在我的 MonoDroid 应用程序中使用 SQLite,但我找到的每个教程都引用了我没有的 Mono.Data.Sqlite.dl
我目前正在启动一个项目,我想开发一个 Android 和桌面应用程序以使用 mono for android .我想将通用逻辑封装到一个共享库中,但目前我不确定如何容纳这两个框架。 谢谢! 最佳答案
如何使用 C# Monodroid 操作事件处理程序: m_listView.OnTouchEvent += OnTouchEvent; 它不像按钮或项目那样工作,它给出了一个错误: "Cannot
我创建了一个在 Android 设备上运行的简单网络服务器,它基本上响应在 Preview 11 之前工作的 Hello World。是否有任何重大变化导致它不再工作或者我做错了什么?应用程序崩溃 c
从这个示例开始:https://github.com/xamarin/monodroid-samples/blob/master/ApiDemo/Graphics/CameraPreview.cs 如
在具有不同屏幕尺寸和密度的不同设备上测试使用 MonoDroid 开发的应用程序时,我得到了一些非常有趣的结果。 我在我的项目中设置了以下(简化的)文件夹结构: 可绘制 图片.png drawable
Monodroid 中的这些 Android 功能有哪些等价物?找不到他们! Animation.ABSOLUTE Animation.RELATIVE_TO_SELF Animation.RELAT
ViewPager 是否可供 monodroid 开发人员使用?我看过很多像这样的 Android 教程:http://android-developers.blogspot.com/2011/08/
我只从事 Android 应用程序开发工作几天,所以请原谅我的无知。我正在尝试为 EditText 设置一个监听器,该监听器将在该字段失去焦点后触发。我在 java 中找到了一些示例,但找不到用于 m
我搜索了几个小时以找到解决此问题的有效解决方案,并设法创建了一个。我希望有人也可以使用这个解决方案。 最佳答案 private GestureDetector _gestureDetector; pr
我正在尝试安排一项服务在用户指定的时间每天运行。我正在使用时间选择器让用户控制服务在一天中的什么时间运行。 每次用户更改服务运行的时间时,我都会更新警报管理器。 这是我的代码: void Resche
我正在尝试发送一封邮件以及附加的多个文件,但是我无法将它们添加到邮件中。我这样进行: private void SendMail (List ToSend) { var Att
刚开始使用 Monodroid,目前正在研究 ListView。我在 ArrayAdapter 中添加了一个列表,我可以正确地看到我的前两个项目。但是,当我向列表中添加第三个元素时, ListView
使用 MonoTouch 完成并成功发布了我的第一个 iPhone 应用程序后,我现在正在寻找同一应用程序的 Android 版本。 MonoTouch 对我很有帮助,因为我仍然认为 Objectiv
我有一个图像(看起来像一个圆形的加载圆圈),我想围绕它自己的中心旋转。我看到很多代码建议将 PivotY 和 PivotX 设置为 0.5F 或图像的一半.两者都不起作用。经过大量试验和错误后,它确实
所以我一直在努力将一些值放入我覆盖的 OnSaveInstanceState 中的一个包中。我需要在 Activity 重启时保存一些类对象,这意味着它们必须是可分割的,这对于 Monodroid 来
听说可以用C#开发一个android软件。 (单体机器人) 但是当我研究它时,有人表示它运行起来会更慢。 你怎么看?这是真的吗?使用 C# 是否有效? 最佳答案 我们不知道。 说真的,如果有人可以将
我正在使用 MonoDroid 在 Visual Studio 2010 中开发一个 Android 应用程序。我已经很远了,能够在模拟器和 Android 设备上运行和调试我的应用程序。出于某种原因
我是一名优秀的程序员,十分优秀!