2012-07-08 7 views
18

मेरा एप्लिकेशन पूरी तरह से मेरे एंड्रॉइड 2.2 एमुलेटर पर काम कर रहा था। मैंने फिर एंड्रॉइड 4.1 एमुलेटर पर परीक्षण करने का फैसला किया। DatePickerDialog थोड़ा अलग दिखता है और कुछ कारणों से जब मैं "पूर्ण" पर दबाता हूं, onDateSet() श्रोता को दो बार बुलाया जाता है और मेरे आवेदन में समस्याएं आती हैं।एंड्रॉइड: एंड्रॉइड 4.1 एमुलेटर डेटपिकर डायलॉग पर डेटसेट दो बार आमंत्रित करना

मैं यह जानता हूँ क्योंकि लॉग कोड में नीचे दिखाया गया है छपा है दो बार जब भी मैं "हो गया"

mDateSetListener = new DatePickerDialog.OnDateSetListener() { 
    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
      Log.v("onDateSet", "ENTERED"); 
      //rest of code... 
    }}; 

Android 2.2 DatePicker

Working Android 2.2 DatePicker

Android 4.1 DatePicker

पर क्लिक करें

Not Working Android 4.1 DatePicker

+3

एक ही समस्या एंड्रॉइड 4.1 एमुलेटर पर 30 अगस्त, 2012, यहां वोट करें https://code.google.com/p/android/issues/detail?id=34860 ​​ – Moak

+0

[जेली बीन डेटपिकरडियलॉग --- के संभावित डुप्लिकेट --- वहां है रद्द करने का एक तरीका?] (http: // stackoverflow।कॉम/प्रश्न/11444238/जेली-बीन-डेटपिकरडियलॉग-ए-वे-ए-वे-टू-रद्द) –

उत्तर

24

उसी संवाद में डबल आग की जांच करने के लिए बूलियन सेट करने का प्रयास करें। कुछ के समान:

Calendar c = Calendar.getInstance(); 
c.add(Calendar.DAY_OF_YEAR, 1); 
final DatePickerDialog dateDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { 
    boolean fired = false; 
    public void onDateSet(final DatePicker view, final int year, final int monthOfYear, final int dayOfMonth) { 
     Log.i("PEW PEW", "Double fire check"); 
     if (fired) { 
      Log.i("PEW PEW", "Double fire occured. Silently-ish returning"); 
      return; 
     } else { 
      //first time fired 
      fired = true; 
     } 
     //Normal date picking logic goes here 
    } 
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)); 
dateDialog.show(); 

इस दोहरे आग मुद्दा भी एक TimePickerDialog की onTimeSet के साथ होता है और इस जाँच को भी उन लोगों के लिए काम करता है।

+0

हां, यह काम करना चाहिए। मुझे उम्मीद है कि वे जल्द ही इस मुद्दे को ठीक करेंगे। –

+1

'निकाल दिया गया' वैरिएबल वापस 'झूठी' पर टॉगल करें ताकि डेटपिकर बाद में काम करना जारी रखे। वैसे, टाइमपिकर संवाद में समस्या भी होती है। –

+0

यह कार्य-आसपास की अवधारणा सृजन पर एक समान "निकाल दी गई" जांच का उपयोग करके टाइमपीकर संवाद के लिए भी काम करती है। – lodlock

0

मुझे लगता है कि यह संबंधित है, मैंने आज 4.1 पर परीक्षण करना शुरू कर दिया है और कुछ जावास्क्रिप्ट घटनाएं दो बार आग लगती हैं। ज्यादातर इस समय क्लिक करें। अजीब बात अगर मैं एक चेतावनी में जोड़ता हूं तो कभी-कभी 'कभी-कभी' आग लगती है। व्यवहार अजीब असंगत है।

जावास्क्रिप्ट ईवेंट केवल एंड्रॉइड 4.1 पर इस तरह से प्रतिक्रिया देते हैं। एंड्रॉइड के पिछले सभी संस्करणों के रूप में आईफोन ठीक लगता है मैंने अभी तक कोशिश की है (4.0.x सहित)।

यह ब्राउज़र के साथ एक त्रुटि या जिस तरह से मेरे लिए जावास्क्रिप्ट को संभालने का तरीका लगता है लेकिन यह सिर्फ एक अनुमान है।

+0

क्या इस त्रुटि को हल करने के लिए कोई सुझाव हैं? कोई कामकाज? :) –

+0

मुझे अब तक कुछ भी नहीं मिला है। उपरोक्त के लिए अतिरिक्त यह केवल क्लिक या स्पर्श घटनाओं पर प्रतीत होता है। सभी घटनाओं नहीं। (जब मुझे कुछ समय मिलता है) मैं एंड्रॉइड बग सूची पर एक बग रिपोर्ट तैयार करूंगा। – Dan

1
अंकुर चौधरी की शानदार answer समान TimePickerDialog मुद्दे पर के अनुसार

, अगर हम पिकर को विस्तार या के लिए जाँच के लिए onDateSet अंदर की जाँच की है, तो दिए गए दृश्य isShown() है या नहीं, यह न्यूनतम प्रयास से पूरे मुद्दे का समाधान होगा, कोई आवश्यकता नहीं होती

public void onDateSet(DatePicker view, int year, int month, int day) { 
    if (view.isShown()) { 
     // read the date here :) 
    } 
} 

और निश्चित रूप से एक ही अंकुर के जवाब

0

दोहराना करने के लिए के अनुसार onTimeSet के लिए किया जा सकता है: थी कुछ घृणित झंडे कोड चारों ओर जा रहा या यहां तक ​​कि OS संस्करण के लिए जाँच, बस निम्न कार्य करें एंड्रॉइड में एक पुष्ट बग है। दो वर्कअराउंड पहले ही सुझाए जा चुके हैं, राज्य को एक (उदाहरण) चर में सहेज रहे हैं या डायलॉग पूछ रहे हैं यदि यह isShown() है। लेकिन isShown() अविश्वसनीय प्रतीत होता है (उदाहरण के लिए this answer's comments के अनुसार) और यदि आप संवाद को फिर से दिखाना चाहते हैं तो राज्य को सहेजना गन्दा हो जाता है।
एक बेहतर समाधान संवाद के अंदर ही राज्य को बचाने के लिए है:

public void onDateSet(DatePicker picker, int year, int monthOfYear, int dayOfMonth) { 
    if (picker.getTag() == null) { 
     picker.setTag("TAGGED"); 
     // Only gets called once per Dialog 
    } 
} 

यह स्वच्छ और प्रभावी है।

संबंधित मुद्दे