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)
cambieLoadApplication(new App());
aapp = new App();
LoadApplication(app);
y
OnBackPressed()
métodoOnBackPressed()
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
}
Puedes usar este nuget chd.hwBackButtonManager nuget
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;
}
}