2012-05-22 85 views
5

函數完成之前用戶的響應AlertDialog.Builder像messagebox,但我想等到用戶回答。我該怎麼做?messagebox for 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

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

+0

我不能用它 – mcxxx

+0

我無法理解你的答案...你看不到鏈接或其他任何東西? – Ponmalar

回答

11

斯圖爾特的答案在這裏是正確的,但我只是想擴大一點,因爲似乎仍然存在一些混淆,這是設計應用程序的一個重要概念。

當您處理用戶界面中的事情時,例如響應用戶輸入或提示輸入信息,您永遠不想阻止用戶界面。因此,在這些情況下,您需要以允許異步執行的方式設計代碼。正如您注意到的那樣,在您的代碼示例中,該函數立即返回,因爲它不會等待回調被執行。如果它確實等待,UI線程將被阻止,並且您的應用程序將被凍結,這幾乎肯定不是您想要的。

由於我沒有這個函數調用的任何上下文,我將組成一個簡單的例子。假設您想獲取函數的返回值並將其寫入日誌。使用您所提供的同步方法,這將是這個樣子:

bool returnValue = test(); 

Console.WriteLine(returnValue); 

相反,我會建議做的是重組test()方法,使得異步的行爲。我想改寫它看起來是這樣的:

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

這個版本非常相似,你的,只是不用直接從方法調用返回的值,它是通過該方法的回調參數送回。寫出來的日誌中的代碼可以被更新到這一點:

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

我有一個blog post up here也通過各種方法做在後臺線程工作,並在UI中顯示的結果,如果適用於會談你的情況。希望這有助於解決問題!

+0

傳統上,'MessageBox' *會阻止UI。 – Cullub

5

我知道這是舊的,但我根據我在這裏和那裏找到的答案開發了一個簡單的幫助程序,所以我將這裏放在希望它可以幫助某人。享受..

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

不錯的除了帖子,我用了類似的東西,但不是'Action '我有'Action ':) –