2015-02-27 19 views
11

Voglio impedire la chiusura dell'app premendo il pulsante Indietro hardware nei moduli xamarin su Android.Prevenire la chiusura con il pulsante Indietro nei moduli xamarin su Android

Desidero, che sia possibile navigare con il pulsante Indietro hardware nell'app (che cosa funziona), ma non si desidera uscire, quando viene raggiunta la prima pagina nello stack di navigazione.

Ho provato a utilizzare l'evento OnSleep nei moduli xamarin, ma qui non riesco a cancellare l'uscita.

Ho anche provato cattura il pulsante indietro in Android:

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

Ma quando si utilizza Xamarin forme, non so quale pagina è attualmente in mostra. Quindi non so se il back di navigazione è consentito o meno

risposta

14

Funziona con la valutazione di NavigationStack (quando si utilizza NavigationPage).

nella mia attività, ho l'override del OnBackPressed

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

Nel mio forme Xamarin app (App.Instance (si tratta di un singolo)), valuterò la NavigationStack della corrente pagina come questa.

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

Quando c'è solo una pagina a sinistra nel NavigationStack io non chiamerò base.OnBackPressed, in modo che io non chiudere l'App.

! [Test]

0

Ecco una soluzione che funziona su Android.
Introduci un contatore nella classe dell'applicazione e incrementalo con ogni OnStart e diminuisci con ogni OnStop in questo modo quando il contatore è saprai di essere alla tua ultima attività.

Inutile dire che utilizzare un'implementazione di attività di base in modo da non dover copiare il codice della piastra della caldaia.

+0

Questo non funzionerà, perché sto usando i moduli xamarin, così avrò solo un'attività – Chris

9

Ed ecco ciò che il codice potrebbe apparire come un Xamarin Forms scenario pagina MasterDetail ...

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

solo dare una chiamata in bianco nella pagina in cui si vuole impedire , come

protected override bool OnBackButtonPressed() 
{ 
return true; 
} 

Ciò impedirà il pulsante Indietro in XF-Droid.

0

La soluzione proposta può funzionare correttamente, ma non mi piace "esposizione delle proprietà statiche" per risolvere i problemi. Inoltre, non mi piace l'utilizzo delle soluzioni "proprietà come metodi", soprattutto quando è coinvolta molta logica.

Il problema principale qui è come possiamo gestire il metodo OnBackButton() dalla nostra classe Xamarin.Forms.Application.

Cosa ne pensi di fare la stessa cosa in un modo più elegante?

Per prima cosa è necessario estendere Xamarin.Forms.Classe di applicazione come questa:

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

L'implementazione dell'app ora utilizzerà questa classe come classe base. Ricordarsi di modificare il vostro XAML e le vostre xaml.cs di conseguenza:

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

Nell'implementazione App.cs ora è possibile ignorare il metodo OnBackButton().

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 
} 

Quindi è necessario modificare leggermente l'implementazione della classe Attività.

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 
} 
Problemi correlati