2012-05-22 15 views
5

La respuesta del usuario antes de la función completa AlertDialog.Builder como messagebox pero quiero esperar hasta que el usuario responda. ¿Como lo hago?messagebox para android mono

  public bool test() 
      { 
        bool tst=false; 

        AlertDialog.Builder builder = new AlertDialog.Builder (this); 
        builder.SetTitle (Android.Resource.String.DialogAlertTitle); 
        builder.SetIcon (Android.Resource.Drawable.IcDialogAlert); 
        builder.SetMessage ("message"); 
        builder.SetPositiveButton ("OK",(sender,e)=>{ 
          tst=true; 
        }); 
        builder.SetNegativeButton ("NO",(sender,e)=>{ 
          tst=false; 
        }); 

        builder.Show(); 

        return tst; 
      } 
+0

Comprobar esto: http://stackoverflow.com/questions/4381296/android-wait-on-user-input-from-dialog – Ponmalar

+0

no puedo usarlo – mcxxx

+0

yo no podía entender su respuesta ... ¿No podías ver el enlace o cualquier otra cosa? – Ponmalar

Respuesta

11

La respuesta de Stuart aquí es correcta, pero solo quería ampliar un poco ya que todavía parece haber confusión y este es un concepto importante para diseñar aplicaciones.

Cuando se trata de cosas en la interfaz de usuario, como responder a la entrada del usuario o solicitar información, nunca desea bloquear la interfaz de usuario. Como tal, en situaciones como estas necesitas diseñar tu código de una manera que permita que se ejecute de forma asincrónica. Como ha notado, en el caso de su muestra de código, la función vuelve de inmediato ya que no esperará a que se ejecute la devolución de llamada. Si esperó, el hilo de la interfaz de usuario se bloquearía y su aplicación se congelaría, lo que seguramente no es lo que quiere.

Como no tengo contexto para esta llamada de función, crearé un ejemplo simple. Digamos que quería obtener el valor de retorno de la función y escribirla en el registro. Utilizando el enfoque sincrónico que ya ha proporcionado, eso sería algo como esto:

bool returnValue = test(); 

Console.WriteLine(returnValue); 

En su lugar, lo que sugeriría hacer es la reestructuración del método test() de tal manera que se comporta de forma asíncrona. Me gustaría volver a escribir a ser algo como esto:

public void test(Action<bool> callback) 
{ 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.SetTitle(Android.Resource.String.DialogAlertTitle); 
    builder.SetIcon(Android.Resource.Drawable.IcDialogAlert); 
    builder.SetMessage("message"); 
    builder.SetPositiveButton("OK", (sender, e) => 
            { 
             callback(true); 
            }); 
    builder.SetNegativeButton("NO", (sender, e) => 
            { 
             callback(false); 
            }); 

    builder.Show(); 
} 

Esta versión es muy similar a la suya, excepto que en lugar de devolver el valor directamente de la llamada al método, se envía de nuevo a través del parámetro de devolución de llamada del método. El código para escribir en el registro puede ser actualizada a esto:

test(returnValue => 
{ 
    Console.WriteLine(returnValue); 
}); 

Tengo un blog post up here que también habla de diferentes maneras de hacer el trabajo en las discusiones de fondo y mostrar los resultados en la interfaz de usuario, si es que se aplica a su situación en absoluto. Espero que esto ayude a aclarar las cosas!

+0

Tradicionalmente, un 'MessageBox' * no * bloquea la IU, sin embargo. – Cullub

5

Sé que esto es viejo, pero he desarrollado un simple ayudante basado en las respuestas que he encontrado aquí y allá, así que estoy aquí con la esperanza de que ayude a alguien. Disfrutar ..

using System; 
using Android.App; 
using Android.Content; 

namespace MyApp.Helpers 
{ 
    #region Enums 
    public enum MessageBoxResult 
    { 
     None = 0, 
     OK, 
     Cancel, 
     Yes, 
     No 
    } 

    public enum MessageBoxButton 
    { 
     OK = 0, 
     OKCancel, 
     YesNo, 
     YesNoCancel 
    } 

    public enum MessageBoxButtonText 
    { 
     Ok, 
     Cancel, 
     Yes, 
     No 
    } 

    #endregion 

    public static class MessageBoxHelper 
    { 
     public static void Show(Context context, Action<bool> callback, string messageBoxText, string caption, MessageBoxButton buttonType) 
     { 
      AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context); 
      alertBuilder.SetTitle(caption); 
      //builder.SetIcon(Android.Resource.Drawable.IcDialogAlert); 
      alertBuilder.SetMessage(messageBoxText); 

      switch (buttonType) 
      { 
       case MessageBoxButton.OK: 
        alertBuilder.SetPositiveButton(MessageBoxButtonText.Ok.ToString(), (sender, e) => callback(true)); 
        break; 

       case MessageBoxButton.OKCancel: 
        alertBuilder.SetPositiveButton(MessageBoxButtonText.Ok.ToString(), (sender, e) => callback(true)); 
        alertBuilder.SetNegativeButton(MessageBoxButtonText.Cancel.ToString(), (sender, e) => callback(false)); 
        break; 

       case MessageBoxButton.YesNo: 
        alertBuilder.SetPositiveButton(MessageBoxButtonText.Yes.ToString(), (sender, e) => callback(true)); 
        alertBuilder.SetNegativeButton(MessageBoxButtonText.No.ToString(), (sender, e) => callback(false)); 
        break; 
      } 
      alertBuilder.Show(); 
     } 

     public static void Show(Context context, string messageBoxText) 
     { 
      Show(context, delegate(bool b) { }, messageBoxText, "", MessageBoxButton.OK); 
     } 

     public static void Show(Context context, string messageBoxText, string caption) 
     { 
      Show(context, delegate(bool b) { }, messageBoxText, caption, MessageBoxButton.OK); 
     } 
    } 
} 
+2

Agradable además de la publicación, he usado algo similar, pero en lugar de 'Acción ' Tengo 'Action ' :) –