2012-05-22 18 views
5

Risposta dall'utente prima che la funzione completi AlertDialog.Builder come messagebox ma voglio attendere fino a quando l'utente non risponde. Come lo faccio?messagebox per 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

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

+0

non posso usarlo – mcxxx

+0

non riuscivo a capire la tua risposta ... Non hai visto il link o altro? – Ponmalar

risposta

11

La risposta di Stuart qui è corretta, ma volevo solo espanderci un po 'perché sembra che ci sia ancora un po' di confusione e questo è un concetto importante per la progettazione di applicazioni.

Quando si ha a che fare con elementi dell'interfaccia utente, come rispondere all'input dell'utente o chiedere informazioni, non si desidera bloccare l'interfaccia utente. Pertanto, in situazioni come queste è necessario progettare il codice in modo da consentirne l'esecuzione in modo asincrono. Come hai notato, nel caso del tuo esempio di codice la funzione ritorna subito poiché non aspetterà che il callback venga eseguito. Se lo avesse fatto, il thread dell'interfaccia utente sarebbe stato bloccato e la tua applicazione sarebbe stata bloccata, il che non è quasi certamente quello che desideri.

Poiché non ho alcun contesto per questa chiamata di funzione, farò un semplice esempio. Diciamo che volevi ottenere il valore di ritorno della funzione e scriverlo nel log. Utilizzando l'approccio sincrono che hai fornito, che sarebbe simile a questa:

bool returnValue = test(); 

Console.WriteLine(returnValue); 

Invece, quello che vorrei suggerire facendo è la ristrutturazione del metodo test() in modo tale che si comporta in modo asincrono. Vorrei riscrivere a cercare qualcosa di simile:

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(); 
} 

Questa versione è molto simile al tuo, solo che invece di restituire il valore direttamente dalla chiamata al metodo, esso viene rispedito tramite il parametro callback del metodo. Il codice di scrivere nel registro può quindi essere aggiornato a questo:

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

Ho un blog post up here che parla anche di diversi modi per farlo lavorare in thread in background e visualizzare i risultati nell'interfaccia utente, se questo vale per la tua situazione Spero che questo aiuti a chiarire le cose!

+0

Tradizionalmente, un 'MessageBox' * non blocca l'interfaccia utente, però. – Cullub

5

So che questo è vecchio, ma ho sviluppato un semplice aiuto basato sulle risposte che ho trovato qui e là, quindi sto mettendo qui la speranza che aiuti qualcuno. Godetevi ..

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

Bella aggiunta al post, ho usato qualcosa di simile ma invece di 'Azione ' Ho 'Azione ' :) –