Обнаружение изменения URL с помощью веб-просмотра Xamarin.Forms и сравнение текущего URL с оригинальным URL - PullRequest
0 голосов
/ 23 мая 2019

Итак, я создаю приложение, которое использует Xamarin.Forms Webview.Я пытаюсь определить, когда изменяется URL-адрес, и сравнивает ли он исходный URL-адрес с текущим, а затем показывает или скрывает кнопку в зависимости.Назначение кнопок - вернуться на предыдущую страницу и продолжать идти до тех пор, пока она не достигнет своего первоначального назначения.Я хочу, чтобы эта кнопка «назад» отображалась, когда пользователь не на рабочем столе.В противном случае всегда показывайте.

Я пробовал все с помощью if (webview.cangoback ...), но это не обнаруживает изменение URL.Я попытался установить строку, равную исходному URL-адресу, и использовать .Equals для сравнения webview.source (где я сейчас нахожусь)

Я только начал изучать webviewNavigating, но все еще ничего.

namespace Webview_Test
{
    public partial class MainPage : ContentPage
    {
        public static string CurrentUrl { get; set; }
        public MainPage()
        {

            InitializeComponent();

            string CurrentUrl = "https://www.google.com/";

            var _webView = new WebView()
            {
                Source = "https://www.google.com/",
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand
            };

            Button BackButton = new Button
            {
                Text = "Go Back",
                BackgroundColor = Color.FromHex("990000"),
                TextColor = Color.White
            };
            BackButton.Clicked += OnBackButtonClicked;

            void OnBackButtonClicked(object sender, EventArgs e)
            {
                _webView.GoBack();
            }


            Grid grid = new Grid
            {
                VerticalOptions = LayoutOptions.FillAndExpand,
                RowDefinitions =
                {
                    new RowDefinition { Height = GridLength.Auto },
                    new RowDefinition { Height = GridLength.Auto },
                    new RowDefinition { Height = new GridLength(1, GridUnitType.Star) },
                    new RowDefinition { Height = new GridLength(50, GridUnitType.Absolute) },
                    new RowDefinition { Height = new GridLength(15, GridUnitType.Absolute) },
                    new RowDefinition { Height = new GridLength(15, GridUnitType.Absolute) },
                    new RowDefinition { Height = new GridLength(36, GridUnitType.Absolute) }
                },
                ColumnDefinitions =
                {
                    new ColumnDefinition { Width = GridLength.Auto },
                    new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) },
                    new ColumnDefinition { Width = new GridLength(50, GridUnitType.Absolute) },
                    new ColumnDefinition { Width = new GridLength(50, GridUnitType.Absolute) },
                    new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) },
                    new ColumnDefinition { Width = GridLength.Auto }
                }
            };

            grid.Children.Add(_webView, 0, 6, 0, 7);

            if (_webView.Source.Equals(CurrentUrl))
            {
                grid.Children.Remove(BackButton);
            }
            else
            {
                grid.Children.Add(BackButton, 2, 4, 4, 6);
            }

            Content = grid;
        }
    }
}

Мой ожидаемый результат заключается в том, что на главной странице кнопка с надписью «вернуться назад» не отображается.Но на любой странице, кроме домашней, должна отображаться кнопка «вернуться».В логических терминах это, если OriginalURL = CurrentURL не показывать кнопку.если OriginalURL! = кнопка показа CurrentURL.

1 Ответ

0 голосов
/ 24 мая 2019

Я создаю собственный рендерер webView на каждой платформе, чтобы получить текущий URL-адрес webView, он немного сложен, но наконец-то работает.

В iOS part переопределите метод LoadingFinished, чтобы получить текущий URL:

[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]
namespace App374.iOS
{
    public class MyWebViewRenderer : WebViewRenderer,IUIWebViewDelegate
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            if (e.OldElement == null)
            {   // perform initial setup
                UIWebView myWebView = (UIWebView)this.NativeView;

                Delegate = new CustomWebViewDelegate(e.NewElement as WebView);
            }
        }
    }

    public class CustomWebViewDelegate : UIWebViewDelegate
    {
        Xamarin.Forms.WebView formsWebView;

        public CustomWebViewDelegate(WebView webView)
        {
            formsWebView = webView;
        }

        public override void LoadingFinished(UIWebView webView)
        {
            var url = webView.Request.Url.AbsoluteUrl.ToString();

            MainPage.CurrentUrl = webView.Request.Url.AbsoluteString;

            MainPage.checkToShowButton();
        }

    }
}

В части Android переопределите метод OnPageFinished, чтобы получить текущий URL:

[assembly: ExportRenderer (typeof (MyWebView), typeof (MyWebViewRenderer))]
namespace App374.Droid
{
    public class MyWebViewRenderer : WebViewRenderer
    {
        public MyWebViewRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);
            if (e.OldElement == null)
            {
                // lets get a reference to the native control
                var webView = (global::Android.Webkit.WebView)Control;
                webView.SetWebViewClient(new MyWebViewClient());
                webView.SetInitialScale(0);
                webView.Settings.JavaScriptEnabled = true;
            }
        }
    }

    public class MyWebViewClient : WebViewClient
    {
        public override void OnPageFinished(Android.Webkit.WebView view, string url)
        {
            base.OnPageFinished(view, url);

            MainPage.CurrentUrl = url;

            MainPage.checkToShowButton();
        }
    }
}

И введите код, проверьте, показывать ли кнопку возврата назад после каждой навигации:

 public partial class MainPage : ContentPage
    {
        public static string CurrentUrl { get; set; }

        public static MyWebView _webView;

        public static Grid grid;

        public static Button BackButton;


        public MainPage()
        {

            InitializeComponent();

            string CurrentUrl = "https://www.baidu.com/";

            _webView = new MyWebView()
            {
                Source = CurrentUrl,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand
            };


            BackButton = new Button
            {
                Text = "Go Back",
                BackgroundColor = Color.FromHex("990000"),
                TextColor = Color.White
            };

            grid = new Grid
            {
                 //...
            };

            grid.Children.Add(_webView, 0, 6, 0, 7);


            Content = grid;

            checkToShowButton();

            //Button click
            BackButton.Clicked += OnBackButtonClicked;
            void OnBackButtonClicked(object sender, EventArgs e)
            {
                _webView.GoBack();        

                checkToShowButton();

                if (_webView.CanGoBack == false)
                {
                    grid.Children.Remove(BackButton);
                }
            }
        }

        //Check whther to show goBack button
        public static void checkToShowButton()
        {

            if ("https://www.baidu.com/".Equals(MainPage.CurrentUrl) || CurrentUrl == null || CurrentUrl == "")
            {
                grid.Children.Remove(BackButton);
            }
            else
            {

                if (grid != null)
                {
                    grid.Children.Add(BackButton, 2, 4, 4, 6);
                }

            }
        }

    }

    public class MyWebView : WebView { }

Я загрузил весь свой образец здесь , и вы можете проверить его. Дайте мне знать, если это работает.

Примечание : я протестировал _webView.Navigated и обнаружил, что он только запускается при загрузке webView.

 _webView.Navigated += (sender, e) => {

 };

См .: webview-check-когда-сайт-адрес-изменен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...