Xamarin.forms Hybridwebview Navigieren und Navigieren Problem

Xamarin.forms Hybridwebview Navigieren und Navigieren Problem

Die Lösung für Xamarin.forms Hybridwebview Navigations- und Navigationsproblem
ist unten angegeben:

Ich brauche Hilfe. Navigieren und Navigationscodes funktionieren in meinem Projekt nicht. Animation wird nicht gelöscht, wenn die Seite voll ist. Externer Link funktioniert nicht im Gerätebrowser. Mein Code:

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

Ja, Navigationsereignis wird nicht ausgelöst. Ja, ich habe die App auf meinem Android-Gerät getestet. Entschuldigung für mein Englisch.. Mein 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>

Das Navigationsereignis würde nicht ausgelöst, weil Sie einen benutzerdefinierten Renderer für die Webansicht verwenden und den WebViewClient zurücksetzen, wir können das Navigationsereignis innerhalb der benutzerdefinierten Klasse verwalten.

Seit ShouldOverrideUrlLoading Methode veraltet ist, empfehle ich Ihnen dringend, eine andere Methode wie OnPageStarted zu verwenden , OnPageFinished ,OnReceivedError .

Anzeige der Aktivitätsanzeige in OnPageStarted -Methode und verstecke sie in OnPageFinished und OnReceivedError Methode .

Um dies zu erreichen, können wir DependencyService verwenden, aber Messaging Center ist hier besser .

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

Hauptseite

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