2010-06-26 6 views
8

मैं उपयोगकर्ता को दिनांक चुनने के लिए एंड्रॉइड में डेटपिकर का उपयोग कर रहा हूं। मैं इसे एक काम करना चाहता हूं यदि उपयोगकर्ता एक तारीख चुनता है और इसे सेट करता है (मेरे पास यह ठीक काम कर रहा है) और उसके बाद कोई निश्चित टेक्स्ट फ़ील्ड साफ़ करने के लिए यदि उपयोगकर्ता डेटपिकर पर रद्द बटन दबाता है (डेटपिकर खोलें लेकिन फिर रद्द करें इसका)।एंड्रॉइड में डेटपिकर्स रद्द करने के बटन के लिए श्रोता कैसे बनाएं?

तरह से मैं कोशिश कर रहा है एक

private DatePickerDialog.OnCancelListener mDateCancelListener = 
    new DatePickerDialog.OnCancelListener() { 
     public void onCancel(DialogInterface dialog) { 
      timeClear(); //method that clears text field 
     } 

    }; 

बनाकर है तो मैं

TimePickerDialog timeDialog = new TimePickerDialog(this, 
    mTimeSetListener, 
    c.get(Calendar.HOUR), 
    c.get(Calendar.MINUTE), 
    false); 
timeDialog.setOnCancelListener(mTimeCancelListener); 

कर श्रोता संलग्न करने के लिए।

मेरी समस्या यह है कि श्रोता काम करता है अगर उपयोगकर्ता बैक बटन दबाता है, लेकिन अगर वे रद्द बटन दबाएंगे। मैंने एक खारिज श्रोता का उपयोग करने की कोशिश की, और यह काम करता है, इस तथ्य को छोड़कर कि यह बंद हो जाता है भले ही मैं डेटपिकर को सेट या रद्द कर दूं!

मुझे ऐसा करने की क्या ज़रूरत है अगर कुछ और बंद हो जाए तो केवल अगर मैं अपने डेटपिकर पर रद्द बटन दबाता हूं?

+0

मैं वही चीज़ करने की कोशिश कर रहा हूं लेकिन तारीख पिकर के साथ। नीचे दिए गए प्रस्तावित समाधान में, ऐप क्रैश हो जाता है क्योंकि .getButton (TimePickerDialog.BUTTON_NEGATIVE) शून्य लौट रहा है। क्या किसी के पास इसका समाधान है? –

+1

चेक इस [1]: http://stackoverflow.com/questions/2928902/can-we-get-cancel-click-listerner-of-datepicker-dialog – W00di

उत्तर

0

इस प्रयास करें:

timeDialog.getButton(TimePickerDialog.BUTTON_NEGATIVE).setOnClickListener(mTimeCancelListener); 

कुछ प्रयोग के बाद

+0

प्रतिक्रिया के लिए धन्यवाद! मुझे अभी भी थोड़ी परेशानी है। यदि मैं एक DialogInterface.OnClickListener बना देता हूं और टाइमपिकर के लिए इसका उपयोग करने का प्रयास करता हूं, तो यह मुझे बताता है कि मुझे इसे पहले डालना होगा। यदि मैं करता हूं, तो जब आप टाइमपिकर खोलने के लिए बटन पर क्लिक करते हैं तो प्रोग्राम बस क्रैश हो जाता है। तुम नहीं तो यह कहते हैं setOnClickListener (android.view.View.OnClickListener) android.view.View में करने के लिए लागू नहीं किया जा सकता (android.content.DialogInterface.OnClickListener) timeDialog.getButton (TimePickerDialog.BUTTON_NEGATIVE) .setOnClickListener (dateTimeClickCancelListener); – Adam

+0

और मैंने एक DialogInterfaceListener के बजाय View.OnClickListner() बनाने का प्रयास किया, और जब मैं टाइमपिकर संवाद – Adam

1

ठीक है, मैं ने पाया है कि क्या जरूरत है एक OnDismissListener के रूप में नीचे दिखाया गया है (आप mTimeCancelListener बदलने के लिए DialogInterface.OnClickListener बजाय OnCancelListener को लागू करना होगा) । ध्यान दें कि मैंने टाइमपिकरडियलॉग के लिए अपना समाधान विकसित किया है, लेकिन setOnDismissListener को संवाद से विरासत में मिला है, इसलिए इसे डेटपिकरडियलॉग के लिए भी काम करना चाहिए।

timeDialog.setOnDismissListener(mOnDismissListener); 


private DialogInterface.OnDismissListener mOnDismissListener = 
    new DialogInterface.OnDismissListener() { 
     public void onDismiss(DialogInterface dialog) { 
      _logger.v("mOnDismissListener called"); 
      timeClear(); 
     } 
    }; 

मैंने इसका परीक्षण किया है और यह काम करता है। असल में, मैंने पाया है कि ऑनडिस्मिस लिस्टर को उन दोनों परिदृश्यों में बुलाया जाता है जिनका आप उल्लेख करते हैं, जब उपयोगकर्ता रद्द करें बटन पर क्लिक करता है और जब वे हार्डवेयर बैक बटन दबाते हैं। तो आपको केवल इस एक हैंडलर की आवश्यकता है।

अन्त में, अब मैं क्या के लिए गूगल को पता है कि, मैं this article कि "श्रोताओं को खारिज का उपयोग करना" एक OnDismissListener और एक OnCancelListener के बीच अंतर का वर्णन करता है, अनुभाग में पाया:

+0

खोलने का प्रयास करता हूं तो प्रोग्राम केवल क्रैश हो जाता है, यह नहीं पूछा जाता है - ऑनडिस्मिस को निकाल दिया जाता है इससे कोई फर्क नहीं पड़ता कि बटन क्या दबाया जाता है, लेकिन पोस्टर जानना चाहता है कि रद्द बटन दबाया गया था। वे यह भी कहते हैं कि उन्होंने पहले ही डिस्मिज़ श्रोता पर कोशिश की है। – barry

+0

@barry good point .. मुझे जो दिलचस्प लगता है वह है कि "ऑनकैनल लिस्टनर" के पास दिनांक पिकर संवाद पर रद्द करें बटन से कोई लेना देना नहीं है। W00di की टिप्पणी सही जवाब है ... इतना संभव डुप्लिकेट। – giulio

4

एकमात्र समाधान, सहज ज्ञान युक्त का मुकाबला, कि आप "ओवरराइड" को रद्द बटन की आवश्यकता है:

timeDialog.setButton(DialogInterface.BUTTON_NEGATIVE, 
      getString(R.string.cancel), 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        // do stuff 
       } 
      }); 
+0

यह ऑनटाइमसेट विधि को भी कॉल करता है। तो अनुक्रमिक रूप से यह नकारात्मक श्रोता को सकारात्मक श्रोता कहते हैं। –

2

आप एक बूलियन चर isDataSet बना सकते हैं और dateSetListener में कर सकते हैं प्रदर्शन isDataSet सच =; और उसके बाद इस तरह के एक कोड के साथ onDismissListener देते हैं:

if(isDataSet) 
    //Data was set and neither back nor cancel button was clicked 
else 
    //back or cancel button was clicked 

लेकिन यह न भूलें isDataSet = false हर बार जब आप एक संवाद बनाने के स्थापित करने के लिए।

0

पूर्ण समाधान (परीक्षण और कामकाजी) ऑनडिस्मिस लिस्टर (ऊपर केनेथ बाल्ट्रिनिक के उत्तर 3 को देखें) को गठबंधन (उपरोक्त 1 उत्तर) द्वारा वर्णित ऑनडेटसेट बूलियन के साथ जोड़ना है। आपको दोनों की आवश्यकता है क्योंकि ऑनडिस्मिस का उपयोग सभी मामलों में किया जाता है: (1) उपयोगकर्ता ने वास्तविक डेटा (2) उपयोगकर्ता को (3) रद्द कर दिया है उपयोगकर्ता ने हार्डवेयर बैक बटन मारा है।

संयोजन का उपयोग करके आप उनके बीच अंतर करने में सक्षम हो जाते हैं।

0

यह समाधान है। यह किसी भी

datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      if (which == DialogInterface.BUTTON_NEGATIVE) { 
       // do something 
      } 
     } 
    }); 
संबंधित मुद्दे