2015-02-27 7 views
11

Ich möchte verhindern, schließen Sie die App durch Drücken der Hardware-Taste in Xamarin Formen auf Android zurück.Verhindern Schließung durch Zurück-Taste in Xamarin Formen auf Android

Ich möchte, dass Sie mit der Hardware-Zurück-Taste in der App navigieren können (was funktioniert), aber nicht beenden wollen, wenn die erste Seite im Navigations-Stack erreicht ist.

Ich habe versucht, das Ereignis OnSleep in Xamarin Formen zu verwenden, aber hier kann ich den Ausgang nicht abbrechen.

Ich habe auch versucht die Zurück-Taste in android Fang:

public override void OnBackPressed() 
    { 
     //base.OnBackPressed(); 
    } 

Aber wenn Formen mit Xamarin, ich weiß nicht, welche Seite gerade angezeigt wird. Also ich weiß nicht, ob die Navigation zurück erlaubt ist oder nicht

Antwort

14

Es funktioniert mit der Auswertung der NavigationStack (wenn Sie NavigationPage verwenden).

In meiner Tätigkeit habe ich die OnBackPressed außer Kraft setzen

public override void OnBackPressed() 
{ 
    if(App.Instance.DoBack) 
    { 
     base.OnBackPressed(); 
    } 
} 

In meiner Xamarin Formen app (App.Instance (es ist ein Singleton)), werde ich die NavigationStack der aktuellen Seite wie diese bewerten.

public bool DoBack 
{ 
    get 
    { 
     NavigationPage mainPage = MainPage as NavigationPage; 
     if (mainPage != null) 
     { 
      return mainPage.Navigation.NavigationStack.Count > 1; 
     } 
     return true;     
    } 
} 

Wenn nur eine Seite links in den NavigationStack Ich werde nicht base.OnBackPressed nennen, so dass ich nicht die App schließen.

! [Test]

0

Hier ist eine Lösung, die auf Android funktioniert.
Führen Sie einen Zähler in der Anwendungsklasse ein und inkrementieren Sie ihn mit jedem OnStart und dekrementieren Sie ihn mit jedem OnStop auf diese Weise, wenn der Zähler ist, wissen Sie, dass Sie bei Ihrer letzten Aktivität sind.

Es erübrigt sich zu erwähnen, dass Sie eine Basisaktivitätsimplementierung verwenden, so dass Sie den Code der Kesselplatte nicht kopieren müssen.

+0

Das wird nicht funktionieren, weil ich bin mit Formen Xamarin, so dass ich eine einzige Aktivität haben – Chris

9

Und hier ist es, was der Code wie für Szenario einer Xamarin Forms Masterdetail-Seite aussehen könnte ...

public bool DoBack 
    { 
     get 
     { 
      MasterDetailPage mainPage = App.Current.MainPage as MasterDetailPage; 

      if (mainPage != null) 
      {  
       bool canDoBack = mainPage.Detail.Navigation.NavigationStack.Count > 1 || mainPage.IsPresented; 

       // we are on a top level page and the Master menu is NOT showing 
       if (!canDoBack) 
       { 
        // don't exit the app just show the Master menu page 
        mainPage.IsPresented = true; 
        return false; 
       } 
       else 
       { 
        return true; 
       }      
      } 
      return true; 
     } 
    } 
2

einfach einen leeren Anruf auf der Seite geben, wo Sie verhindern wollen , wie

protected override bool OnBackButtonPressed() 
{ 
return true; 
} 

Dies wird die Zurück-Taste in XF-Droid verhindern.

0

Die vorgeschlagene Lösung kann gut funktionieren, aber ich mag keine "statische Eigenschaftsexposition", um Probleme zu lösen. Darüber hinaus mag ich die Verwendung von "Eigenschaften als Methoden" -Lösungen nicht, besonders wenn viel Logik involviert ist.

Das Hauptproblem hier, wie wir die OnBackButton() Methode aus unserer Xamarin.Forms.Application-Klasse behandeln können.

Wie wäre es, das Gleiche eleganter zu machen?

Zuerst müssen Sie die Xamarin.Forms erweitern.Anwendungsklasse wie folgt aus:

namespace YourNameSpace 
{ 
    public class Application : Xamarin.Forms.Application 
    { 
     #region Public Methods 

     public bool HandleBackButton() 
     { 
      return OnBackPressed(); 
     } 

     #endregion 

     #region Application Methods 

     protected virtual bool OnBackPressed() 
     { 
      return false; 
     } 

     #endregion 
    } 
} 

Ihre App Implementierung wird nun diese Klasse als Basisklasse verwenden. Denken Sie daran, Ihre XAML und Ihre xaml.cs entsprechend zu ändern:

<common:Application xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:common="clr-namespace:YourNameSpace" 
      x:Class="YourNameSpace.App"> 
</common:Application> 

In Ihrer App.cs Implementierung Sie jetzt die OnBackButton() -Methode außer Kraft setzen kann.

public partial class App : YourNameSpace.Application 
{ 
    #region Constructors 

    public App() 
    { 
     InitializeComponent(); 
    } 

    #endregion 

    #region App Methods 

    protected override bool OnBackPressed() 
    { 
     // Handle when the back button is pressed 
     return false; 
    } 

    #endregion 
} 

Dann müssen Sie ein wenig Ihre Implementierung der Aktivitätsklasse ändern.

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
{ 
    #region Constants and Fields 

    private App _app; 

    #endregion 

    #region Activity Methods 

    protected override void OnCreate(Bundle bundle) 
    { 
     TabLayoutResource = Resource.Layout.Tabbar; 
     ToolbarResource = Resource.Layout.Toolbar; 

     base.OnCreate(bundle); 

     global::Xamarin.Forms.Forms.Init(this, bundle); 

     _app = new App(); 
     LoadApplication(_app); 
    } 

    public override void OnBackPressed() 
    { 
     if(!_app.HandleBackButton()) 
      base.OnBackPressed(); 
    } 

    #endregion 
} 
Verwandte Themen