您好我已经在我的xamarin表单pcl项目中实现了混合webview。我有一个html页面,我在其中创建了一个mailto链接,但它没有点击它,它没有显示找到的网页。
在uwp中,它要求打开应用程序。
Hybridwebview
public class HybridWebView : View
{
Action<string> action;
public static readonly BindableProperty UriProperty = BindableProperty.Create(
propertyName: "Uri",
returnType: typeof(string),
declaringType: typeof(HybridWebView),
defaultValue: default(string));
public string Uri
{
get { return (string)GetValue(UriProperty); }
set { SetValue(UriProperty, value); }
}
public void RegisterAction(Action<string> callback)
{
action = callback;
}
public void Cleanup()
{
action = null;
}
public void InvokeAction(string data)
{
if (action == null || data == null)
{
return;
}
action.Invoke(data);
}
}
Droid中的渲染器 -
public class HybridWebViewRenderer : ViewRenderer<HybridWebView, Android.Webkit.WebView>
{
const string JavaScriptFunction = "function invokeCSharpAction(data){jsBridge.invokeAction(data);}";
const string downloadFunction = "function downloadbook(data){jsBridge.invokeDownloadAction(data);}";
protected override void OnElementChanged(ElementChangedEventArgs<HybridWebView> e)
{
base.OnElementChanged(e);
Android.Webkit.WebView.SetWebContentsDebuggingEnabled(true);
if (Control == null)
{
var webView = new Android.Webkit.WebView(Forms.Context);
webView.Settings.JavaScriptEnabled = true;
SetNativeControl(webView);
}
if (e.OldElement != null)
{
Control.RemoveJavascriptInterface("jsBridge");
var hybridWebView = e.OldElement as HybridWebView;
hybridWebView.Cleanup();
}
if (e.NewElement != null)
{
Control.AddJavascriptInterface(new JSBridge(this), "jsBridge");
Control.LoadUrl(string.Format("file:///android_asset/Content/{0}", Element.Uri));
//string url = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), Element.Uri);
//Control.LoadUrl(string.Format("file://{0}", url));
Task.Run(() => {
Task.WaitAny(Task.Delay(2000));
InjectJS(JavaScriptFunction);
CallJS();
});
}
}
void InjectJS(string script)
{
if (Control != null)
{
Control.LoadUrl(string.Format("Javascript: {0}", script));
}
}
void CallJS()
{
if (Control != null)
{
try
{
}
catch (Exception ex)
{ }
}
}
}
答案 0 :(得分:1)
您应该订阅OnNavigating
的{{1}}事件,并在那里处理mailto链接。
WebView
取消导航非常重要,因为您正在移出应用程序,并且WebView无需再尝试导航。
答案 1 :(得分:0)
我的webview是混合的。我这次添加了代码。
我发现了您的问题,因为您的HybridWebView
继承自View
,而不是WebView的Xamainr Forms,您无法订阅WebView
的事件。解决问题的一种方法是,您可以修改HybridWebView
类以继承WebView
:
public class HybridWebView : WebView
如果您使用此方法,则Control
中的HybridWebViewRenderer
会引用Android.Webkit.WebView
,您不需要创建新的Navigating
。
ShouldOverrideUrlLoading
事件应在PCL中订阅,但如果您想在Android项目中执行此操作,您还可以实施自己的WebViewClient并覆盖CREATE TABLE transaction (
hour int,
day int,
month int,
year int,
transaction_id text,
item_code bigint,
payment_method text,
user_id bigint,
PRIMARY KEY ((hour, day, month, year), transaction_id)
);
事件。