event disable android xamarin xamarin.forms

disable - Evita que se cierre con el botón Atrás en las formas de xamarin en Android



xamarin forms detect back button (7)

Quiero evitar que se cierre la aplicación presionando el botón Atrás del hardware en las formas xamarin en Android.

Quiero, que pueda navegar con el botón Atrás del hardware en la aplicación (lo que funciona), pero no quiere salir cuando se alcanza la primera página en la pila de navegación.

Intenté usar el evento OnSleep en formularios de xamarin, pero aquí no puedo cancelar la salida.

También traté de atrapar el botón de atrás en Android:

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

Pero cuando uso formularios de xamarin, no sé qué página se muestra actualmente. Así que no sé si la navegación hacia atrás está permitida o no.


Ampliando la respuesta de Chris, ya que no hay una App.Instance Ahora la App.Instance no se puede acceder a la aplicación de forma estática dentro del código de la plataforma.

1. App.xaml.cs

public bool DoBack { get { return MainPage.Navigation.NavigationStack.Count>1; } }

2. MainActivity.cs bajo proyecto de Android

  • declarar variable de clase de la aplicación

    App app;

  • en OnCrate(Bundle bundle) cambie LoadApplication(new App()); a

    app = new App();
    LoadApplication(app);

  • y OnBackPressed() método OnBackPressed()

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


Aquí hay una solución que funciona en Android.
Introduzca un contador en la clase de aplicación, OnStart con cada OnStart y OnStart con cada OnStop esta manera cuando el contador sea 1 sabrá que está en su última actividad.

No hace falta decir que use una implementación de actividad básica para no tener que copiar el código de la placa de la caldera.


Funciona con la evaluación de NavigationStack (cuando usas NavigationPage).

En mi actividad, anulo el OnBackPressed

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

En mi aplicación de formularios de xamarin (App.Instance (es un singleton)), evaluaré la pila de navegación de la página actual como esta.

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

Cuando solo queda una página en NavigationStack, no llamaré a base.OnBackPressed, por lo que no cerraré la aplicación.

![prueba]


La solución propuesta puede funcionar bien, pero no me gusta la "exposición a propiedades estáticas" para resolver problemas. Además, no me gusta el uso de soluciones de "propiedades como métodos", especialmente cuando hay mucha lógica involucrada.

El problema principal aquí es cómo podemos manejar el método OnBackButton () desde nuestra clase de aplicación Xamarin.Forms.

¿Qué hay de hacer lo mismo de una manera más elegante?

Primero necesitas extender la clase de aplicación Xamarin.Forms.Aplplication como esta:

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

Su aplicación de aplicación ahora utilizará esta clase como clase base. Recuerde modificar su xaml y su xaml.cs en consecuencia:

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

En su implementación de App.cs ahora puede anular el método 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 }

Entonces necesitas cambiar un poco la implementación de tu clase de actividad.

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 }



Solo da una llamada en blanco en la página donde quieres prevenir, como

protected override bool OnBackButtonPressed() { return true; }

Esto evitará el botón de retroceso en XF-Droid.


Y aquí está el aspecto que podría tener el código para un escenario de página de Xamarin Forms 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; } }