2012-12-06 16 views
13

कहा जाता है जब मैं एक संवाद दिखाने के लिए कॉल करता हूं, तो मेरे पास यह ऐप है, इसे किसी भी तरह से दो बार कहा जा रहा है। यह केवल एंड्रॉइड 4.1 और उसके बाद होता है। निचला संस्करण ठीक काम करता है इसलिए मुझे नहीं लगता कि यह कोई कोड मुद्दा है।एंड्रॉइड 4.1.2 संवाद दो बार

क्या आपने सुना है कि इससे पहले इस समस्या का सामना करना पड़ा था?

यहाँ कोड:

Button edit = (Button) ad.findViewById(R.id.editBtn); 
     edit.setTypeface(roboto); 
     edit.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       setDate(); 
       ad.dismiss(); 
      } 
     }); 

     ad.show(); 

     ad.setOnDismissListener(new OnDismissListener() { 

      @Override 
      public void onDismiss(DialogInterface dialog) { 
       shiftsActivity.setPressed(true); 

      } 
     }); 
    } 

    public void setDate() { 
    // Initialize and open the set date dialog 
    DatePickerDialog setDateDialog = new DatePickerDialog(Shifts.this, 
      datePickerListener, dateAndTime.get(Calendar.YEAR), 
      dateAndTime.get(Calendar.MONTH), 
      dateAndTime.get(Calendar.DAY_OF_MONTH)); 

    setDateDialog.setTitle("Set Date"); 
    setDateDialog.show(); 

} 

public void setStartTime() { 

    TimePickerDialog setStartTimeDialog = new TimePickerDialog(Shifts.this, 
      startTimePicker, dateAndTime.get(Calendar.HOUR), 
      dateAndTime.get(Calendar.MINUTE), true); 

    setStartTimeDialog.setTitle("Started At:"); 
    setStartTimeDialog.show(); 

} 

public void setEndTime() { 

    TimePickerDialog setEndTimeDialog = new TimePickerDialog(Shifts.this, 
      setEndTime, dateAndTime.get(Calendar.HOUR), 
      dateAndTime.get(Calendar.MINUTE), true); 
    setEndTimeDialog.setTitle("Ended:"); 
    setEndTimeDialog.show(); 
} 

TimePickerDialog.OnTimeSetListener startTimePicker = new TimePickerDialog.OnTimeSetListener() { 

    @Override 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
     startIntHours = hourOfDay; 
     startIntMinutes = minute; 
     editStartTime = String.format("%02d", hourOfDay) + ":" 
       + String.format("%02d", minute); 
     setEndTime(); 

    } 
}; 

TimePickerDialog.OnTimeSetListener setEndTime = new TimePickerDialog.OnTimeSetListener() { 

    @Override 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 

     finishIntHours = hourOfDay; 
     finsihIntMinutes = minute; 

     if (finishIntHours < startIntHours) { 
      finishIntHours = finishIntHours + Utility.HOURS_TIME_UNIT; 
     } 

     if (finsihIntMinutes < startIntMinutes) { 
      finsihIntMinutes = finsihIntMinutes + Utility.MINUTES_TIME_UNIT; 
     } 

     totalHours = finishIntHours - startIntHours; 
     totalMinutes = finsihIntMinutes - startIntMinutes; 
     Log.i("TotalHours in time picker", "" + totalHours); 
     Log.i("Totalminute in time picker", "" + totalMinutes); 

     editEndTime = String.format("%02d", hourOfDay) + ":" 
       + String.format("%02d", minute); 

     replace(Shifts.view, Shifts.position); 

    } 
}; 
+1

दिलचस्प हिस्सा है: जहां 'कहा जाता setStartTime' है – zapl

+0

4.0.3 पर यह काम करता है सामान्य – Talha

+0

यही सच है, समस्याओं 4.1 और उसके बाद से शुरू करते हैं। – Yosi199

उत्तर

12

अपने कोड के अनुसार, उन तरीकों में से कोई भी कभी भी, कहा जाता है क्योंकि आप TimePickerDialogs का उपयोग कभी नहीं। http://code.google.com/p/android/issues/detail?id=34833

+0

आपके त्वरित उत्तर मार्क के लिए धन्यवाद, मैंने कोड जोड़ा है जो पूरे प्रवाह को कॉल करता है। बटन के क्लिक पर जिसे आप setDate() कहते हैं और प्रवाह शुरू होता है। – Yosi199

+0

@ योसी 1 9 9: अगर मैंने जो बग उद्धृत किया है, वह आपकी मदद नहीं करता है, तो मेरे पास कोई और जवाब नहीं है। हालांकि, मुझे ऐसा लगता है कि उपयोगकर्ता के लिए दो अलग-अलग संवादों के साथ झगड़ा करने के बजाय, 'डेटपिकर' और 'टाइमपीकर' की मेजबानी करने के लिए एक 'डेट एंडटाइम एक्टिविटी' होना बेहतर होगा। – CommonsWare

+0

मैं बग की समीक्षा करने की योजना बना रहा हूं क्योंकि आपके द्वारा प्रदान किए गए लिंक में एक सुझाए गए अस्थायी समाधान हैं। अन्यथा मैं अपना कोड दोबारा देखूंगा और आपके सुझाव पर विचार करूंगा। मैं आपके समय के लिए बहुत बहुत धन्यवाद और आपने मेरी मदद की। – Yosi199

0

मैं इसे कोशिश करते हैं और यह काम अच्छा है मेरे साथ अगर आप अभी भी समस्या classic singleton

कुछ इस तरह उपयोग करने के लिए :) इसके बारे में और अधिक पढ़ कोशिश की है।

public void setStartTime() { 

    TimePickerDialog setStartTimeDialog = NULL; 
    if(setStartTimeDialog == null) { 
     new TimePickerDialog(Shifts.this, startTimePicker, dateAndTime.get(Calendar.HOUR),dateAndTime.get(Calendar.MINUTE), true); 

    setStartTimeDialog.setTitle("Started At:"); 
     } 
    setStartTimeDialog.show(); 

} 
+0

आपकी मदद के लिए धन्यवाद लेकिन इससे मेरी मदद नहीं हुई। मैंने कोड अपडेट किया है इसलिए यदि आप इसे एक और रूप दे सकते हैं तो मैं सराहना करूंगा। धन्यवाद – Yosi199

2

आप एंड्रॉयड स्रोत में देखें, तो ऐसा लगता है onTimeSet() onStop दौरान कहा जाता हो जाता है कि():

कहा जा रहा है, वहाँ DatePickerDialog/TimePickerDialog के व्यवहार कि प्रासंगिक हो सकता है से संबंधित एक ज्ञात समस्या है । संवाद उस टाइमक्लिक() विधि पर ऑनसाइट() विधि पर भी कॉल करता है।

मैं ओवरराइड करने के लिए संवाद को खारिज करने और एक बूलियन जो मैं जाँच की है, तो onTimeSet बटन क्लिक से बुलाया जा रहा था स्थापित करने के लिए काम करता है को रद्द करने या खारिज/रद्द

+0

धन्यवाद, यह अब प्रासंगिक नहीं है लेकिन मैं अभी भी भविष्य में उपयोग के लिए इस जानकारी को महत्व देता हूं – Yosi199

3

यहाँ था इस के आसपास पाने के लिए, एक बुनियादी समाधान है के लिए कोई है जो एक TimeChooserDialog की जरूरत है, कि श्रोता दो बार फोन नहीं करता है, बुनियादी विकल्प

public static AlertDialog getTimePickerDialog(Context context, final OnTimeSetListener listener, int hour, int minute, boolean is24HFormat) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    final TimePicker timePicker = new TimePicker(context); 
    timePicker.setIs24HourView(is24HFormat); 
    timePicker.setCurrentHour(hour); 
    timePicker.setCurrentMinute(minute); 
    builder.setView(timePicker); 
    builder.setPositiveButton(android.R.string.ok, new OnClickListener() { 
     @Override 
     public void onClick(DialogInterface arg0, int arg1) { 
      if(null != listener) { 
       listener.onTimeSet(timePicker, timePicker.getCurrentHour(), timePicker.getCurrentMinute()); 
      } 
     } 
    }); 
    builder.setNegativeButton(android.R.string.cancel, null); 
    return builder.create(); 
} 
+0

यह आपके द्वारा दो बार किए गए कस्टम संवाद को बुलाता है। – James

-1

साथ मैं इस मुद्दे timepicker दो बार दिखा सामना करना पड़ा। मैंने TimePickerDialog के ऑनस्टॉप() को ओवरराइड किया है और इस मुद्दे को हल किया है। इसके अलावा आपको super.ontop() को अपने overriden ontop() पर कॉल नहीं करना चाहिए।

@Override 
public void onStop() { 
    //super.onStop(); 
    Log.d(TAG, "onStop of starttime TimePickerDialog."); 
} 
+0

03-14 15: 18: 47.8 9 1: ई/एंड्रॉइड रनटाइम (2 9 055): android.app.SuperNotCalledException: Fragment DatePickerFragment {425cf2a0} super.onStop() 03-14 15: 185 479191: E/AndroidRuntime (29055): android.app.Fragment.performStop (Fragment.java:1961) पर \t 03-14 15: 18: 47.891: ई/AndroidRuntime (29055): \t android.app.FragmentManagerImpl.moveToState पर (FragmentManager। जावा: 970) –

0

बिल्ट-इन टाइमपिकरडियलॉग या डेटपिकरडियलॉग का उपयोग न करें। इसके बजाय यहां दिखाए गए कस्टम संवाद बनाएं। यह उपयोग करना आसान और आसान है और बस काम करता है!

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     final TimePicker timePicker = new TimePicker(getActivity()); 
     builder.setTitle("Set Time"); 
     builder.setView(timePicker); 
     builder.setNegativeButton("Cancel", new OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 

      } 
     }); 
     builder.setPositiveButton("OK"), new OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       int minute = timePicker.getCurrentMinute(); 
       int hourOfDay = timePicker.getCurrentHour(); 
      } 
     }); 
     builder.show(); 
1

टाइमपीकर के लिए मेरे साथ एक ही समस्या होती है। मैं उस मुद्दे को हल करता हूं।

new TimePickerDialog.OnTimeSetListener() { 
    @Override 
    public void onTimeSet(TimePicker view, int setHour, int setMinute) { 
     if (view.isShown()) { 
      // This method will return true only once 
     } 
    } 
}; 

iShown():

इस दृश्य की दृश्यता और

रिटर्न अपने पूर्वजों के सभी रिटर्न यह सच है कि अगर यह देख सकते हैं और अपने पूर्वजों के सभी दिखाई दे रहे हैं

0

का उल्लंघन करने के बजाय super.onClose() या कस्टम डायलॉग करना, मैं इसे वास्तविक श्रोता को लपेटकर और टाइमपिकरडियलॉग को विस्तारित करके हल करता हूं जो रैपर से वास्तविक श्रोता तक अग्रेषित करने और अक्षम करने में सक्षम बनाता है। यह प्रतिस्थापन में गिरावट नहीं है, लेकिन यह काफी साफ है।

public class TimePickerDialogCustom extends TimePickerDialog 
{ 
    protected TimePickerDialogOnTimeSetListenerWrapper listenerWrapper; 

    public TimePickerDialogCustom(Context context, 
      TimePickerDialogOnTimeSetListenerWrapper listener, 
      int hourOfDay, int minute, boolean is24HourView) 
    { 
     super(context, listener, hourOfDay, minute, is24HourView); 
     listenerWrapper = listener; 
    } 
    @Override 
    protected void onStop() 
    { 
     if (listenerWrapper != null) 
      listenerWrapper.enabled = false; 
     super.onStop(); 
     if (listenerWrapper != null) 
      listenerWrapper.enabled = true; 
    } 
    public static final class TimePickerDialogOnTimeSetListenerWrapper implements TimePickerDialog.OnTimeSetListener 
    { 
     private boolean enabled = true; 
     private final TimePickerDialog.OnTimeSetListener delegate; 

     public TimePickerDialogOnTimeSetListenerWrapper(TimePickerDialog.OnTimeSetListener delegate) 
     { 
      this.delegate = delegate; 
     } 
     @Override 
     public void onTimeSet(TimePicker view, int hourOfDay, int minute) 
     { 
      if (enabled) 
      { 
       this.delegate.onTimeSet(view, hourOfDay, minute); 
      } 
     } 
    } 
} 

तो यह उपयोग करने के लिए:

TimePickerDialogCustom.TimePickerDialogOnTimeSetListenerWrapper listenerWrapper = 
      new TimePickerDialogCustom.TimePickerDialogOnTimeSetListenerWrapper(realListener); 
    // Create a new instance of DatePickerDialog and return it 
    TimePickerDialogCustom dialog = new TimePickerDialogCustom(
      getActivity(), 
      listenerWrapper, 
      hourOfDay, 
      minute, 
      DateFormat.is24HourFormat(getActivity())); 
संबंधित मुद्दे