2012-05-22 7 views
5

फ़ंक्शन से पहले उपयोगकर्ता से प्रतिक्रिया संदेश से पहले AlertDialog.Builder को पूरा करने से पहले प्रतिक्रिया देता है लेकिन मैं उपयोगकर्ता का उत्तर देने तक प्रतीक्षा करना चाहता हूं। मेरा क्या हाल है?एंड्रॉइड मोनो

  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 है भी पृष्ठभूमि धागे में काम करते हैं और, यूआई में परिणाम प्रदर्शित है कि अगर लागू होता है करने के लिए विभिन्न तरीकों के बारे में बात करती है आपकी स्थिति बिल्कुल उम्मीद है कि यह चीजों को स्पष्ट करने में मदद करता है!

+0

का उपयोग नहीं कर सकता, पारंपरिक रूप से, 'MessageBox' * * UI को अवरुद्ध करता है। – Cullub

1

वहाँ Xamarin

आप कोड नहीं रोक सकते हैं और जवाब के लिए इंतजार से https://github.com/xamarin/monodroid-samples/blob/master/ApiDemo/App/AlertDialogSamples.cs में एक पूर्ण नमूना है - आप के बजाय जवाब घटना का जवाब देना होगा।

+0

के रूप में रोकने के लिए करने की आवश्यकता है, मैं इसे – mcxxx

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

पोस्ट के लिए अच्छा जोड़ा, मैंने कुछ ऐसा ही उपयोग किया है, लेकिन 'एक्शन ' के बजाय मेरे पास 'एक्शन ':) है –