我开始开发连接到网络项目的移动应用程序,让患者记下他们的出血情况。在网络上,用户可以点击并选择几个人物上的某些地方。有一些选择的人看起来像这样
我真的不认为使用标准控件(?)很容易实现,所以我认为最容易使用WebView
来托管处理选择的代码片段。< / p>
要设置位置,例如当用户想要编辑旧的流血时,我可以按照Xamarin指南来了解如何从C#调用JS,但是,返回值是无效的。我无法找到如何从Xamarin.Forms.WebView
获取数据的方法。有什么建议吗?
答案 0 :(得分:0)
这在很大程度上取决于您尝试定位的平台和平台版本。
如果你真的想使用WebView
,你可以查看我认为类似的XLabs Hybrid WebView。
除了XLabs&#39;方法,您可以使用UIWebView.EvaluateJavascript()
方法从iOS渲染器轻松获取字符串,然后您可以在Xamarin Android WebChromClient.OnJsAlert
渲染器(link)中覆盖WebView
,我已经成功使用了Android 4.1。
类似的东西(让我知道如果某些东西不起作用或丢失,我输入并删除了额外的代码,因此可能会出现小问题)......
Xamarin表单代码:
public class SomethingWebView : WebView { }
带有UIWebViewDelegate
的iOS WebView渲染器:
[assembly: Xamarin.Forms.ExportRenderer(typeof(SomethingWebView), typeof(Your.Droid.Namespace.SomethingWebViewRenderer))]
namespace Your.Droid.Namespace.Renderer {
public class SomethingWebViewRenderer : WebViewRenderer {
protected override void OnElementChanged(VisualElementChangedEventArgs e) {
base.OnElementChanged(e);
if(e.OldElement == null) {
Delegate = new SomethingWebViewDelegate();
}
}
}
internal class SomethingWebViewDelegate : UIWebViewDelegate {
public override void LoadingFinished(UIWebView webView) {
string something = webView.EvaluateJavascript("(function() { return 'something'; })()");
}
}
}
带有WebViewClient
和WebChromeClient
的Android WebView渲染器:
[assembly: Xamarin.Forms.ExportRenderer(typeof(SomethingWebView), typeof(Your.iOS.Namespace.SomethingWebViewRenderer))]
namespace Your.iOS.Namespace.Renderer {
public class SomethingWebViewRenderer : WebViewRenderer {
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e) {
base.OnElementChanged(e);
if(e.OldElement == null) {
Control.Settings.JavaScriptEnabled = true;
Control.SetWebViewClient(new SomethingWebViewClient());
Control.SetWebChromeClient(new SomethingWebChromeClient());
}
}
}
internal class SomethingWebViewClient : WebViewClient {
public override void OnPageFinished(Android.Webkit.WebView view, string url) {
base.OnPageFinished(view, url);
view.LoadUrl("javascript:{(function() { window.alert('something'); })()};");
}
}
public class SomethingWebChromeClient : WebChromeClient {
public override bool OnJsAlert(Android.Webkit.WebView view, string url, string message, JsResult result) {
if(message.StartsWith("something") { //This is where you would look for your magic string, anything starting with your magic string is what you would extract and/or act on
//Do something....
result.Cancel(); //This cancels the JS alert (there are other talked about methods of doing this but this works for me)
return true; //This tells the WebView "we got this"
}
return base.OnJsAlert(view, url, message, result); //Let the WebView handle this since we did not find out special string
}
}
}
最后,我看到的另一个方法是使用JavaScript将页面重定向到新的URL,然后在用于告诉WebView是否应该继续使用重定向的事件中,您拉出WebView&# 39;当前的URL,如果找到你的魔法字符串,你会做一些事情。这可能会很有效,除了URL只能长度为255个字符,因此它不能满足我的需求。