本文介绍了如果“target=_blank",Xamarin Android WebView 不会触发导航的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 xamarin 中使用 webview,我遵循了许多教程来处理导航,并且一切正常.我的问题是:当锚标记有目标=_blank"时事件 Navigating 永远不会被触发.

I'm using a webview in xamarin, i followed many tutorials to handle navigation, and all works fine.My issue is : when an anchor tag has a target="_blank" the event Navigating is never fired.

我看到周围有人给出了一个 javascript 解决方案,它删除了 target=_blank 并将其附加在 href 链接的末尾.

I see arround someone give a javascript solution which remove target=_blank and attach it at the end of href link.

这真的是正确的做法吗?看有线..

Is really that the right way to do that? Look wired..

谢谢

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

This is initialization in xamarin.android renderer

        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);
        }
    }

这是我的导航事件,当锚点为 target=_blank 时从未触发

And this is my navigating event, never fired when anchor has target=_blank

        private void webv_Navigating(object sender, WebNavigatingEventArgs e)
    {
        if (IsFirstLoad) { 
            IsBusy = true;
            IsFirstLoad = false;
        }

        if (e.Url.ToLower().StartsWith("tel:") || e.Url.ToString().StartsWith("wtai:") || e.Url.ToLower().StartsWith("sms:") || e.Url.ToLower().StartsWith("mailto:"))
        {
            e.Cancel = true;
        }
    }

这里是我的自定义 WEBView 中 URL 的覆盖函数

here my override function for URL in my custom WEBView

        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;
    }

推荐答案

在 Jack Hua 的大力帮助下,我能够解决问题.在混合渲染器的 OnElementChanged 中,我设置了对多个窗口的支持.

After the great help of Jack Hua i'm able to solve the problem.In OnElementChanged of Hybrid renderer i set support for multiple windows.

Control.Settings.SetSupportMultipleWindows(true);

接下来我不得不在自定义的 chrome webview 中管理 onCreateWindow 事件.这里是从 Jack 建议的链接在 c# 中转换的代码.

and next i had to menage onCreateWindow event in the custom chrome webview.Here the code converted in c# from the link suggested by 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;
    }

这篇关于如果“target=_blank",Xamarin Android WebView 不会触发导航的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-26 06:40