Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Xamarin Android: Mantenga el control con Alert Dialog hasta que se haga clic en un botón

Estamos utilizando un cuadro de diálogo de alerta estática para obtener confirmación del usuario para determinadas acciones. En nuestra llamada a Show() queremos mantener el control hasta que el usuario haga clic en un botón para que podamos devolver el resultado de clic de botón al final de la llamada Show() .

Nuestra versión de iOS (un UIAlertView ) utiliza

 while (displayed) { MonoTouch.Foundation.NSRunLoop.Current.RunUntil( MonoTouch.Foundation.NSDate.FromTimeIntervalSinceNow(0.2)); } 

En su método Show() para esperar la entrada del usuario antes de devolver su selección de botones como resultado.

¿Hay un equivalente de Android a esto que podemos aprovechar en Monodroid?

  • No se puede depurar Xamarin aplicación de Android en VS con ADB
  • Resource.Designer.cs: "Recurso ... no contiene una definición para ..."
  • (Android Xamarin) Obtener valor de cadena de recursos en lugar de int
  • Xamarin Android con multidex - error en modo de depuración
  • Transferencia eficiente de datos de objetos personalizados entre las actividades de Android
  • ¿Es monodroid más lento?
  • Mono para Android - Arquitectura soportada - Drop x86?
  • Xamarin.Android JmDNS vinculante cuestiones
  • 3 Solutions collect form web for “Xamarin Android: Mantenga el control con Alert Dialog hasta que se haga clic en un botón”

    Resuelto a través de un diseño diferente:

    En lugar de esperar a que el usuario interactúe con el diálogo y bloquee todo lo demás, en lugar de ello, proporcionamos un EventHandler en nuestra llamada al método estático Show que se activa cuando el usuario hace clic en un botón:

     public static void Show(string title, string message, Context context, EventHandler handler, ConfirmationAlertButton button) { ... } 

    Mantenemos una referencia privada a la pasada en EventHandler que se dispara en el botón haga clic en lo siguiente:

     private static void OkClicked(object sender, DialogClickEventArgs e) { if (_handler != null) { _handler.Invoke(sender, e); } _instance.Dismiss(); _instance = null; _handler = null; } 

    A continuación se muestra un ejemplo de cómo se ve una llamada a Show desde una Actividad:

     ConfirmationDialog.Show(@"Message title", @"Message text", this, delegate { if (e.Result) { Finish(); } else { Invalidate(); } }, ConfirmationAlertButton.OK); 

    Si a alguien le gustaría obtener más información sobre el uso de un diálogo estático en su aplicación Xamarin Android, házmelo saber!

    Usted tendrá que hacer 2 cosas. Primero, anule el botón de retroceso para evitar que el usuario retroceda la actividad. En segundo lugar, tendrá que crear un cuadro de diálogo personalizado que mantiene la reapertura hasta que el usuario realice la acción correcta. Esto se debe a que el usuario puede tocar fuera del cuadro de diálogo para cancelarlo sin utilizar los botones en la parte inferior del cuadro de diálogo.

    Aquí hay un enlace a una entrada anterior al crear el diálogo personalizado

    La muestra está en java. Si necesita ayuda para traducir a C # puedo darle un ejemplo.

    Aquí está cómo anular el botón de retroceso.

     public override bool OnKeyDown(Keycode keyCode, KeyEvent e) { if (keyCode == Keycode.Back && awaitConfirmation) return true; else return base.OnKeyDown(keyCode, e); } 

    La variable awaitConfirmation sería una variable local (predeterminada a false) que se establecería en true antes de mostrar el diálogo y volver a false cuando el usuario hubiera aceptado la confirmación.

    He solucionado este problema mediante la creación de una clase AlertDialogHelper que muestra el diálogo para mí. Sólo quería compartir mi solución con ustedes.

    Clase de ayuda

     public class AlertDialogHelper : Java.Lang.Object, IDialogInterfaceOnDismissListener { Context context; ManualResetEvent waitHandle; string title; string message; string positiveButtonCaption; string negativeButtonCaption; bool dialogResult; public static async Task<bool> ShowAsync(Context context, string title, string message) { return await AlertDialogHelper.ShowAsync(context, title, message, "OK", "Cancel"); } public static async Task<bool> ShowAsync(Context context, string title, string message, string positiveButton, string negativeButton) { return await new AlertDialogHelper(context, title, message, positiveButton, negativeButton).ShowAsync(); } private AlertDialogHelper(Context context, string title, string message, string positiveButton, string negativeButton) { this.context = context; this.title = title; this.message = message; this.positiveButtonCaption = positiveButton; this.negativeButtonCaption = negativeButton; } private async Task<bool> ShowAsync() { this.waitHandle = new ManualResetEvent(false); new AlertDialog.Builder(this.context) .SetTitle(this.title) .SetMessage(this.message) .SetPositiveButton(this.positiveButtonCaption, OnPositiveClick) .SetNegativeButton(this.negativeButtonCaption, OnNegativeClick) .SetOnDismissListener(this) .Show(); Task<bool> dialogTask = new Task<bool>(() => { this.waitHandle.WaitOne(); return this.dialogResult; }); dialogTask.Start(); return await dialogTask; } private void OnPositiveClick(object sender, DialogClickEventArgs e) { this.dialogResult = true; this.waitHandle.Set(); } private void OnNegativeClick(object sender, DialogClickEventArgs e) { this.dialogResult = false; this.waitHandle.Set(); } public void OnDismiss(IDialogInterface dialog) { this.dialogResult = false; this.waitHandle.Set(); } } 

    Uso

     // Default buttons bool dialogResult = await AlertDialogHelper.ShowAsync(this, "Dialog title", "Some informative message."); // Custom buttons bool dialogResult = await AlertDialogHelper.ShowAsync(this, "Dialog title", "Some informative message.", "Yes", "No"); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.