Xamarin.forms Hybridwebview Navigazione e esplorazione del problema

Xamarin.forms Hybridwebview Navigazione e esplorazione del problema

La soluzione per Xamarin.forms Hybridwebview Navigazione e navigazione del problema
è indicata di seguito:

Ho bisogno di aiuto. I codici di navigazione e navigazione non funzionano nel mio progetto. l'animazione non viene eliminata quando la pagina è piena. Il collegamento esterno non funziona nel browser del dispositivo. Il mio codice:

 public MainPage()
    {
        InitializeComponent();
        NavigationPage.SetHasNavigationBar(this, false);
        webViewElement.Source = "https://mywebsite.com/";
        webViewElement.RegisterAction(ExecuteActionFromJavascript);
        _deviceFeaturesHelper = new DeviceFeaturesHelper();
    }

    void WebOnNavigating(object sender, WebNavigatingEventArgs args)
    {
        loading.IsVisible = true;

        if (args.Url.StartsWith("https://mywebsite.com/"))
        {
            return;
        }
        else
        {
             Device.OpenUri(new Uri(args.Url));

            args.Cancel = true;
        }         
    }

    void WebOnNavigated(object sender, WebNavigatingEventArgs s)
    {
        loading.IsVisible = false;
    }

    protected override bool OnBackButtonPressed()
    {
        webViewElement.GoBack();
        return true;
    }

Sì, naviga evento non attivato. sì ho testato l'app sul mio dispositivo Android. scusa per il mio inglese.. Il mio xaml:

 <ContentPage.Content>


    <AbsoluteLayout>

        <StackLayout AbsoluteLayout.LayoutFlags="All"
                     AbsoluteLayout.LayoutBounds="0,0,1,1">
            <controls:HybridWebView
            x:Name="webViewElement"
            HorizontalOptions="FillAndExpand"
            VerticalOptions="FillAndExpand"
            Navigating="WebOnNavigating"
            Navigated="WebOnNavigated"/>
        </StackLayout>
       

        <Frame AbsoluteLayout.LayoutFlags="PositionProportional"
               AbsoluteLayout.LayoutBounds="0.5,0.5,AutoSize,AutoSize"
               x:Name="loading"
               BackgroundColor="Gray"
               Opacity="0.9"
               IsVisible="True">
            <StackLayout>
                <ActivityIndicator IsRunning="True"/>
                <Label Text="Loading..." TextColor="White"/>
            </StackLayout>
        </Frame>
    </AbsoluteLayout>
        
  
    
</ContentPage.Content>

L'evento di navigazione non verrebbe attivato perché stai utilizzando un renderer personalizzato per la visualizzazione Web e reimposta il client WebView, possiamo gestire l'evento di navigazione all'interno della classe personalizzata.

Dal ShouldOverrideUrlLoading metodo è obsoleto , ti consiglio vivamente di utilizzare un altro metodo come OnPageStarted , OnPageFinished ,OnReceivedError .

Mostra l'indicatore di attività in OnPageStarted metodo e nascondilo in OnPageFinished e OnReceivedError metodo.

Per ottenerlo possiamo usare DependencyService , ma il Centro messaggi è meglio qui .

JavascriptWebViewClient

public override void OnPageStarted(Android.Webkit.WebView view, string url, Bitmap favicon)
{
    base.OnPageStarted(view, url, favicon);

    MessagingCenter.Send<object, bool>(this, "Hi", true);
}

public override void OnPageFinished(Android.Webkit.WebView view, string url)
{
    base.OnPageFinished(view, url);
    view.EvaluateJavascript(_javascript, null);

    MessagingCenter.Send<object,bool>(this, "Hi",false);
}

public override void OnReceivedError(Android.Webkit.WebView view, IWebResourceRequest request, WebResourceError error)
{
     base.OnReceivedError(view, request, error);
     MessagingCenter.Send<object, bool>(this, "Hi", false);
}

Pagina principale

 MessagingCenter.Subscribe<object, bool>(this,"Hi",(obj,show)=> {
     loading.IsVisible = show;
     loading.IsRunning = show;
 });