Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin Android网络视图don';t在“如果”的情况下点火;目标=_blank";_Android_Xamarin.forms_Webview - Fatal编程技术网

Xamarin Android网络视图don';t在“如果”的情况下点火;目标=_blank";

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(

我在xamarin中使用webview,我遵循了许多教程来处理导航,所有的工作都很好。 我的问题是:当锚定标记有target=“\u blank”时,事件导航永远不会触发

我看到arround有人给出了一个javascript解决方案,它删除target=\u blank并将其附加到href链接的末尾

这真的是正确的方法吗?看起来很紧张

多谢各位

这是xamarin.android渲染器中的初始化

        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#。你能稍后接受这个答案吗(单击☑️ ,以便我们可以帮助更多有相同问题的人:)。请稍后接受此答案(单击☑️ 在这个答案的左上角),这样我们就可以帮助更多有同样问题的人:)。