Xamarin Android网络视图don';t在“如果”的情况下点火;目标=_blank";
我在xamarin中使用webview,我遵循了许多教程来处理导航,所有的工作都很好。 我的问题是:当锚定标记有target=“\u blank”时,事件导航永远不会触发 我看到arround有人给出了一个javascript解决方案,它删除target=\u blank并将其附加到href链接的末尾 这真的是正确的方法吗?看起来很紧张 多谢各位 这是xamarin.android渲染器中的初始化Xamarin Android网络视图don';t在“如果”的情况下点火;目标=_blank";,android,xamarin.forms,webview,Android,Xamarin.forms,Webview,我在xamarin中使用webview,我遵循了许多教程来处理导航,所有的工作都很好。 我的问题是:当锚定标记有target=“\u blank”时,事件导航永远不会触发 我看到arround有人给出了一个javascript解决方案,它删除target=\u blank并将其附加到href链接的末尾 这真的是正确的方法吗?看起来很紧张 多谢各位 这是xamarin.android渲染器中的初始化 protected override void OnElementChanged(
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
global::Android.Webkit.WebView.SetWebContentsDebuggingEnabled(true);
if (e.OldElement != null)
{
Control.RemoveJavascriptInterface("jsBridge");
((HybridWebView)Element).Cleanup();
}
if (e.NewElement != null)
{
Control.Settings.JavaScriptEnabled = true;
Control.Settings.DomStorageEnabled = true;
Control.Settings.JavaScriptCanOpenWindowsAutomatically = true;
Control.Settings.SetSupportMultipleWindows(true);
Control.Settings.AllowFileAccessFromFileURLs = true;
Control.Settings.AllowUniversalAccessFromFileURLs = true;
Control.Settings.UserAgentString = Control.Settings.UserAgentString + " crmvw";
Android.Webkit.WebChromeClient xCC = new CustChromeWebViewClient(_context);
Control.SetWebChromeClient(xCC);
Control.SetWebViewClient(new CrmWebViewClient(this, $"javascript: {JavascriptFunction}"));
Control.AddJavascriptInterface(new JSBridge(this), "jsBridge");
Control.LoadUrl(((HybridWebView)Element).Uri);
}
}
这里是自定义WEBView中URL的覆盖函数
public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, Android.Webkit.IWebResourceRequest request)
{
Android.Net.Uri url = request.Url;
if (url.ToString().StartsWith("tel:") || url.ToString().StartsWith("wtai:"))
{
Xamarin.Essentials.PhoneDialer.Open(UtilityXam.Contact.GetPhoneFromHTML(url.ToString()));
return true;
}else if (url.ToString().StartsWith("mailto:"))
{
UtilityXam.Contact xE = new UtilityXam.Contact();
string xEmail = UtilityXam.Contact.GetEmailFromHTML( url.ToString());
var xTask = xE.SendEmail("","",new System.Collections.Generic.List<string>(){ xEmail });
return true;
}
else if (url.ToString().StartsWith("sms:"))
{
UtilityXam.Contact xE = new UtilityXam.Contact();
string xPh = UtilityXam.Contact.GetPhoneFromHTML(url.ToString());
var xTask = xE.SendSMS("", "", new System.Collections.Generic.List<string>() { xPh });
}
else
{
view.LoadUrl(url.ToString());
}
view.SetDownloadListener(new CrmDownloadListener(_context));
return true;
}
public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView视图,Android.Webkit.IWebResourceRequest请求)
{
Android.Net.uriurl=request.url;
if(url.ToString().StartsWith(“电话:”)| url.ToString().StartsWith(“wtai:”)
{
Open(UtilityXam.Contact.GetPhoneFromHTML(url.ToString());
返回true;
}else if(url.ToString().StartsWith(“mailto:”)
{
UtilityXam.Contact xE=新UtilityXam.Contact();
字符串xEmail=UtilityXam.Contact.GetEmailFromHTML(url.ToString());
var xTask=xE.sendmail(“,”,new System.Collections.Generic.List(){xEmail});
返回true;
}
else if(url.ToString().StartsWith(“sms:”)
{
UtilityXam.Contact xE=新UtilityXam.Contact();
字符串xPh=UtilityXam.Contact.GetPhoneFromHTML(url.ToString());
var xTask=xE.SendSMS(“,”,new System.Collections.Generic.List(){xPh});
}
其他的
{
view.LoadUrl(url.ToString());
}
view.SetDownloadListener(新的CrmDownloadListener(_context));
返回true;
}
在华杰的大力帮助下,我终于解决了这个问题。
在混合渲染器的OnElementChanged中,我设置了对多个窗口的支持
Control.Settings.SetSupportMultipleWindows(true);
接下来,我必须在自定义chrome webview中选择onCreateWindow事件。
这里是用c#从Jack建议的链接转换而来的代码
public override bool OnCreateWindow(Android.Webkit.WebView view, bool isDialog, bool isUserGesture, Android.OS.Message resultMsg)
{
Android.Webkit.WebView newWebView = new Android.Webkit.WebView(_context);
view.AddView(newWebView);
Android.Webkit.WebView.WebViewTransport transport = (Android.Webkit.WebView.WebViewTransport) resultMsg.Obj;
transport.WebView = newWebView;
resultMsg.SendToTarget();
return true;
}
在杰克·华的大力帮助下,我终于解决了这个问题。 在混合渲染器的OnElementChanged中,我设置了对多个窗口的支持
Control.Settings.SetSupportMultipleWindows(true);
接下来,我必须在自定义chrome webview中选择onCreateWindow事件。
这里是用c#从Jack建议的链接转换而来的代码
public override bool OnCreateWindow(Android.Webkit.WebView view, bool isDialog, bool isUserGesture, Android.OS.Message resultMsg)
{
Android.Webkit.WebView newWebView = new Android.Webkit.WebView(_context);
view.AddView(newWebView);
Android.Webkit.WebView.WebViewTransport transport = (Android.Webkit.WebView.WebViewTransport) resultMsg.Obj;
transport.WebView = newWebView;
resultMsg.SendToTarget();
return true;
}
这是自v4.8.0.1364以来Xamarin表单中引入的一个bug(至少根据bug报告) 您现在可以通过从url中删除
target=“\u blank”
或设置属性来解决此问题
webView.Settings.SetSupportMultipleWindows(true);
我已经为我们的应用程序修复了它,在一些已经运行在内容上的替换逻辑中,通过条带化target=“\u blank”
和target='\u blank'
Xamarin Forms github有多个未解决的问题报告它
这是自v4.8.0.1364以来Xamarin表单中引入的一个bug(至少根据bug报告) 您现在可以通过从url中删除
target=“\u blank”
或设置属性来解决此问题
webView.Settings.SetSupportMultipleWindows(true);
我已经为我们的应用程序修复了它,在一些已经运行在内容上的替换逻辑中,通过条带化target=“\u blank”
和target='\u blank'
Xamarin Forms github有多个未解决的问题报告它
这是否回答了您的问题。检测url并检查是否存在target=blank。我已经找到并尝试了此解决方案,但它对我不起作用。我将导航事件添加到JS函数中,并通过webview对其进行评估。当我单击target\u blank锚点时,未触发事件导航。我的问题是,为什么没有触发事件?您使用的是Xamarin.forms还是Xamarin.Android?当单击其他URL而不是target\u blank锚定时是否触发事件。是的,会触发其他URL non-target\u blank,导航事件在Xamarin.forms中。我在Xamarin.Android中也有一个渲染器,我在Element changed事件中初始化webview,我启用了对多个窗口的支持,我还添加了一个自定义chromeclient和一个自定义webview,以便添加javascript函数来调用c#。这是否回答了您的问题。检测url并检查是否存在target=blank。我已经找到并尝试了此解决方案,但它对我不起作用。我将导航事件添加到JS函数中,并通过webview对其进行评估。当我单击target\u blank锚点时,未触发事件导航。我的问题是,为什么没有触发事件?您使用的是Xamarin.forms还是Xamarin.Android?当单击其他URL而不是target\u blank锚定时是否触发事件。是的,会触发其他URL non-target\u blank,导航事件在Xamarin.forms中。我在Xamarin.Android中也有一个渲染器,我在Element changed事件中初始化webview,我启用了对多个窗口的支持,我还添加了一个自定义chromeclient和一个自定义webview,以便添加javascript函数来调用c#。你能稍后接受这个答案吗(单击☑️ ,以便我们可以帮助更多有相同问题的人:)。请稍后接受此答案(单击☑️ 在这个答案的左上角),这样我们就可以帮助更多有同样问题的人:)。