2012-11-22 17 views
17

मैं एक Android TimePickerDialog पर pickable maximun और minimun समय निर्धारित करने के लिए एक रास्ता तलाश कर रहा हूँ, और 1 मिनट से 5 मिनट के लिए डिफ़ॉल्ट मिनट का अंतराल बदलने के लिए निर्धारित करते हैं,एंड्रॉयड TimePickerDialog अधिकतम समय

मैंने सोचा था कि था एक आसान, लेकिन मुझे कोई रास्ता नहीं मिल रहा है!

+0

आपको ज़ारोक स्वीकार करना चाहिए का जवाब! यह मेरे लिए ठीक काम कर रहा है! –

+0

हो गया, फ़ीड के लिए thanx वापस! –

+1

कुछ नए उत्तर हैं, मैं अब एंड्रॉइड पर काम नहीं कर रहा हूं, इसलिए मैं इसका परीक्षण नहीं कर पाऊंगा, लेकिन यदि नया उत्तर बेहतर है, तो इसे वोट दें, और मैं इसे नए "सही के रूप में चिह्नित करूंगा "उत्तर –

उत्तर

28

यह fiddlers जवाब देने के लिए एक विस्तार है। किसी भी तरह onTimeChangedListener कुछ एंड्रॉइड संस्करणों में टाइमपिकरडियलॉग द्वारा सेट नहीं किया गया है:

पूर्व। http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.1_r1.2/android/app/TimePickerDialog.java

ऑनटाइम चेंज किए गए मेथोड को कभी भी बुलाया नहीं जाता है! वर्तमान में इस समस्या के लिए सबसे अच्छा समाधान, फिडलर से न्यूनतम/अधिकतम तर्क के साथ एक कस्टम टाइमपिकरडियलॉग कोड करने के लिए उपयुक्त है।

यह और अधिक बदसूरत काम है। (प्रतिबिंब का उपयोग करके श्रोता जोड़ना) मैं वर्तमान में चयनित समय दिखाने के लिए शीर्षक भी अपडेट करता हूं।

package com.mysuger.android.dialogs; 

import java.lang.reflect.Field; 
import java.text.DateFormat; 
import java.util.Calendar; 

import android.app.TimePickerDialog; 
import android.content.Context; 
import android.widget.TimePicker; 

/** 
* A time dialog that allows setting a min and max time. 
* 
*/ 
public class RangeTimePickerDialog extends TimePickerDialog { 

private int minHour = -1; 
private int minMinute = -1; 

private int maxHour = 25; 
private int maxMinute = 25; 

private int currentHour = 0; 
private int currentMinute = 0; 

private Calendar calendar = Calendar.getInstance(); 
private DateFormat dateFormat; 


public RangeTimePickerDialog(Context context, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) { 
    super(context, callBack, hourOfDay, minute, is24HourView); 
    currentHour = hourOfDay; 
    currentMinute = minute; 
    dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT); 

    try { 
     Class<?> superclass = getClass().getSuperclass(); 
     Field mTimePickerField = superclass.getDeclaredField("mTimePicker"); 
     mTimePickerField.setAccessible(true); 
     TimePicker mTimePicker = (TimePicker) mTimePickerField.get(this); 
     mTimePicker.setOnTimeChangedListener(this); 
    } catch (NoSuchFieldException e) { 
    } catch (IllegalArgumentException e) { 
    } catch (IllegalAccessException e) { 
    } 
} 

public void setMin(int hour, int minute) { 
    minHour = hour; 
    minMinute = minute; 
} 

public void setMax(int hour, int minute) { 
    maxHour = hour; 
    maxMinute = minute; 
} 

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

    boolean validTime = true; 
    if (hourOfDay < minHour || (hourOfDay == minHour && minute < minMinute)){ 
     validTime = false; 
    } 

    if (hourOfDay > maxHour || (hourOfDay == maxHour && minute > maxMinute)){ 
     validTime = false; 
    } 

    if (validTime) { 
     currentHour = hourOfDay; 
     currentMinute = minute; 
    } 

    updateTime(currentHour, currentMinute); 
    updateDialogTitle(view, currentHour, currentMinute); 
} 

private void updateDialogTitle(TimePicker timePicker, int hourOfDay, int minute) { 
    calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); 
    calendar.set(Calendar.MINUTE, minute); 
    String title = dateFormat.format(calendar.getTime()); 
    setTitle(title); 
} 
} 
+0

यह उत्तर किसी भी तरह से स्वीकार किया जाना चाहिए +1 –

+0

मेरे सिर को खरोंच करना संवाद खंड में इसे कैसे कार्यान्वित कर सकता है! –

+1

@LOG_TAG एंड्रॉइड डॉक्स – AllDayAmazing

1

अधिकतम/न्यूनतम समय निर्धारित करने के लिए कोई मूल तरीका नहीं है, लेकिन शायद यह onTimeChanged या updateTime का विस्तार करने पर काम करता है, तो आप समय को अपनी सीमाओं के बाहर एक मूल्य पर सेट करने से रोक सकते हैं।

4

आप इसे एक शुरुआती बिंदु के रूप में उपयोग कर सकते हैं।

मैंने टाइमपिकरडियलॉग बढ़ाया और 2 विधियों setMin और setMax जोड़ा।

onTimeChanged विधि में मैं जांचता हूं कि नया समय न्यूनतम/अधिकतम समय के संबंध में मान्य है।

हालांकि यह अभी भी कुछ चमकाने की जरूरत है ...

public class BoundTimePickerDialog extends TimePickerDialog { 

    private int minHour = -1, minMinute = -1, maxHour = 100, maxMinute = 100; 

    private int currentHour, currentMinute; 

    public BoundTimePickerDialog(Context context, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) { 
     super(context, callBack, hourOfDay, minute, is24HourView); 
    } 

    public void setMin(int hour, int minute) { 
     minHour = hour; 
     minMinute = minute; 
    } 

    public void setMax(int hour, int minute) { 
     maxHour = hour; 
     maxMinute = minute; 
    } 

    @Override 
    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { 
     super.onTimeChanged(view, hourOfDay, minute); 

     boolean validTime; 
     if(hourOfDay < minHour) { 
      validTime = false; 
     } 
     else if(hourOfDay == minHour) { 
      validTime = minute >= minMinute; 
     } 
     else if(hourOfDay == maxHour) { 
      validTime = minute <= maxMinute; 
     } 
     else { 
      validTime = true; 
     } 

     if(validTime) { 
      currentHour = hourOfDay; 
      currentMinute = minute; 
     } 
     else { 
      updateTime(currentHour, currentMinute); 
     } 
    } 
} 
+0

पब्लिक क्लास टाइमपिकरफ्रैगमेंट के लिए उपर्युक्त कार्यान्वयन को कैसे बदलें डायलॉगफ्रैगमेंट –

+0

बाउंडटाइम पिकरडियलोग() कन्स्ट्रक्टर में, आपको प्रारंभ करना चाहिए: currentHour और currentMinute। फिर यह perfrctly काम करता है। इसके बिना, एक मामूली मुद्दा है, minhour सेट करें> minHour से घंटा minimun चुनें। हर समय 12: 00 पूर्वाह्न सेट हो जाता है, क्योंकि डिफ़ॉल्ट रूप से वर्तमानहारा शून्य पर सेट हो जाता है। अच्छा कोड यह मेरी मदद करता है :) –

-1

मैंने @Zarooka का समाधान शुरुआती बिंदु के रूप में लिया। मुझे लगता है कि मुझे एक बग मिला है। यदि आपके पास प्रारंभिक समय था जो पहले से ही सीमा से बाहर था, तो आप इसे और स्थानांतरित नहीं कर सके, क्योंकि किसी भी "ऑन चेंज" को खारिज कर दिया गया था। यही कारण है कि मैंने मिनट/अधिकतम सेट करते समय वैध सीमा पर जाने के लिए सेटमैक्स और सेटमिन को बढ़ाया।

package de.appdream.garooda.view; 

import java.util.Calendar; 
import java.util.Date; 

import android.app.TimePickerDialog; 
import android.content.Context; 
import android.text.format.DateFormat; 
import android.widget.TimePicker; 

import java.lang.reflect.Field; 


public class GaroodaTimePickerDialog extends TimePickerDialog { 

private int minHour = -1; 
private int minMinute = -1; 

private int maxHour = 25; 
private int maxMinute = 61; 

private int currentHour = 0; 
private int currentMinute = 0; 

    private Calendar calendar = Calendar.getInstance(); 
    //private DateFormat dateFormat; 

public GaroodaTimePickerDialog(Context context, OnTimeSetListener callBack, int hour, int minute, 
     boolean is24HourView) { 
    super(context, callBack, hour, minute, is24HourView); 

    currentHour = hour; 
    currentMinute = minute; 
    //dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT); 

    try { 
     Class<?> superclass = getClass().getSuperclass(); 
     Field mTimePickerField = superclass.getDeclaredField("mTimePicker"); 
     mTimePickerField.setAccessible(true); 
     TimePicker mTimePicker = (TimePicker) mTimePickerField.get(this); 
     mTimePicker.setOnTimeChangedListener(this); 
    } catch (NoSuchFieldException e) { 
    } catch (IllegalArgumentException e) { 
    } catch (IllegalAccessException e) { 
    } 
} 







public void setMin(int hour, int minute) { 
    minHour = hour; 
    minMinute = minute; 

    Calendar min = Calendar.getInstance(); 
    Calendar existing = Calendar.getInstance(); 

    min.set(Calendar.HOUR_OF_DAY, minHour); 
    min.set(Calendar.MINUTE, minMinute); 

    existing.set(Calendar.HOUR_OF_DAY, currentHour); 
    existing.set(Calendar.MINUTE, currentMinute); 

    if (existing.before(min)) { 
     currentHour = minHour; 
     currentMinute = minMinute; 
     updateTime(currentHour, currentMinute); 
    } 
} 

public void setMax(int hour, int minute) { 
    maxHour = hour; 
    maxMinute = minute; 

    Calendar max = Calendar.getInstance(); 
    Calendar existing = Calendar.getInstance(); 

    max.set(Calendar.HOUR_OF_DAY, maxHour); 
    max.set(Calendar.MINUTE, maxMinute); 

    existing.set(Calendar.HOUR_OF_DAY, currentHour); 
    existing.set(Calendar.MINUTE, currentMinute); 

    if (existing.after(max)) { 
     currentHour = maxHour; 
     currentMinute = maxMinute; 
     updateTime(currentHour, currentMinute); 
    } 

} 

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

    boolean validTime = true; 
    if (hourOfDay < minHour || (hourOfDay == minHour && minute < minMinute)){ 
     validTime = false; 
    } 

    if (hourOfDay > maxHour || (hourOfDay == maxHour && minute > maxMinute)){ 
     validTime = false; 
    } 

    if (validTime) { 
     currentHour = hourOfDay; 
     currentMinute = minute; 
    } 

    updateTime(currentHour, currentMinute); 
    updateDialogTitle(view, currentHour, currentMinute); 
} 

private void updateDialogTitle(TimePicker timePicker, int hourOfDay, int minute) { 
    calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); 
    calendar.set(Calendar.MINUTE, minute); 
    //String title = dateFormat.format(calendar.getTime()); 
    //setTitle(title); 
} 
} 
1

Fiddler की पुन: शामिल होती कोड के बाद:

public class RangeTimePickerDialog extends TimePickerDialog { 

    private int mMinHour = -1; 
    private int mMinMinute = -1; 
    private int mMaxHour = 100; 
    private int mMaxMinute = 100; 
    private int mCurrentHour; 
    private int mCurrentMinute; 

    public RangeTimePickerDialog(Context context, OnTimeSetListener callBack, int hourOfDay, 
     int minute, boolean is24HourView) { 
     super(context, callBack, hourOfDay, minute, is24HourView); 
     mCurrentHour = hourOfDay; 
     mCurrentMinute = minute; 
     // Somehow the onTimeChangedListener is not set by TimePickerDialog 
     // in some Android Versions, so, Adding the listener using 
     // reflections 
     try { 
      Class<?> superclass = getClass().getSuperclass(); 
      Field mTimePickerField = superclass.getDeclaredField("mTimePicker"); 
      mTimePickerField.setAccessible(true); 
      TimePicker mTimePicker = (TimePicker) mTimePickerField.get(this); 
      mTimePicker.setOnTimeChangedListener(this); 
     } catch (NoSuchFieldException e) { 
     } catch (IllegalArgumentException e) { 
     } catch (IllegalAccessException e) { 
     } 
    } 

    public void setMin(int hour, int minute) { 
     mMinHour = hour; 
     mMinMinute = minute; 
    } 

    public void setMax(int hour, int minute) { 
     mMaxHour = hour; 
     mMaxMinute = minute; 
    } 

    @Override 
    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { 
     super.onTimeChanged(view, hourOfDay, minute); 
     boolean validTime; 
     if (((hourOfDay < mMinHour) || (hourOfDay == mMinHour && minute < mMinMinute)) 
       || ((hourOfDay > mMaxHour) || (hourOfDay == mMaxHour && minute > mMaxMinute))) { 
      validTime = false; 
     } else { 
      validTime = true; 
     } 
     if (validTime) { 
      mCurrentHour = hourOfDay; 
      mCurrentMinute = minute; 
     } else { 
      updateTime(mCurrentHour, mCurrentMinute); 
     } 
    } 
} 
0

आशा इस सकता है मददगार। मैंने जोडा टाइम लाइब्रेरी का इस्तेमाल किया।

public class RangeTimePicker extends TimePicker implements 
     TimePicker.OnTimeChangedListener { 

    private int mMinHour = -1; 

    private int mMinMinute = -1; 

    private int mMaxHour = 25; 

    private int mMaxMinute = 61; 

    private int mCurrentHour; 

    private int mCurrentMinute; 


    public RangeTimePicker(Context context) { 
     super(context); 
     setOnTimeChangedListener(this); 
    } 

    public RangeTimePicker(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setOnTimeChangedListener(this); 
    } 

    public RangeTimePicker(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setOnTimeChangedListener(this); 
    } 

    public void setMaxTime(int hourIn24, int minute) { 
     mMaxHour = hourIn24; 
     mMaxMinute = minute; 

     LocalTime currentTime = LocalTime.now(); 
     LocalTime maxTime = new LocalTime(mMaxHour, mMaxMinute); 

     if (currentTime.isAfter(maxTime)) { 
      this.setCurrentHour(mCurrentHour = currentTime.getHourOfDay()); 
      this.setCurrentMinute(
        mCurrentMinute = currentTime.getMinuteOfHour()); 
     } 

    } 

    public void setMinTime(int hourIn24, int minute) { 
     mMinHour = hourIn24; 
     mMinMinute = minute; 

     LocalTime currentTime = LocalTime.now(); 
     LocalTime minTime = new LocalTime(mMinHour, mMinMinute); 

     if (currentTime.isBefore(minTime)) { 
      this.setCurrentHour(mCurrentHour = minTime.getHourOfDay()); 
      this.setCurrentMinute(mCurrentMinute = minTime.getMinuteOfHour()); 
     } 
    } 


    @Override 
    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { 
     boolean validTime = true; 
     if (hourOfDay < mMinHour || (hourOfDay == mMinHour 
       && minute < mMinMinute)) { 
      validTime = false; 
     } 

     if (hourOfDay > mMaxHour || (hourOfDay == mMaxHour 
       && minute > mMaxMinute)) { 
      validTime = false; 
     } 

     if (validTime) { 
      mCurrentHour = hourOfDay; 
      mCurrentMinute = minute; 
     } 

     setCurrentHour(mCurrentHour); 
     setCurrentMinute(mCurrentMinute); 

    } 
} 
0

आशा यह काम, यह मेरे साथ पूरी तरह से काम करता है ...

समय पिकर के लिए अधिक से अधिक समय निर्धारित करें।

 timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { 
     @Override 
     public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { 

      if (!mIsOnTimeChanged) { 
       mIsOnTimeChanged = true; 

       Calendar c = Calendar.getInstance(); 

       //get the selected day if it is before today allow AM and PM trick 
       //else apply rules 


       int selected_year = datePicker.getYear(); 
       int selected_month = datePicker.getMonth(); 
       int selected_day = datePicker.getDayOfMonth(); 


       int today = c.get(Calendar.DAY_OF_MONTH); 
       int year = c.get(Calendar.YEAR); 
       int month = c.get(Calendar.MONTH); 


       int hour = c.get(Calendar.HOUR); 
       hour += 12; 
       int min = c.get(Calendar.MINUTE); 

       //Check if user enter hh | mm | more than current reset the timePicker with the current time 

       //http://stackoverflow.com/questions/2659954/timepickerdialog-and-am-or-pm 

       if ((hourOfDay == hour | hour < hourOfDay | hourOfDay > hour | hour > hourOfDay | minute > min) && (selected_month == month && selected_day == today && selected_year == year)) { 

        int AM_PM_Value = hourOfDay; 

        Calendar datetime = Calendar.getInstance(); 

        int hour_without_24 = (hour - 12); 
        if ((datetime.get(Calendar.AM_PM) == Calendar.AM) && (hourOfDay > hour_without_24)) { 
         //set AM 
         timePicker.setCurrentHour(hour - 12); 
        } 

        if (hourOfDay == (hour - 12) && minute > min) { 
         timePicker.setCurrentMinute(min); 

        } 

        if (hourOfDay > hour && datetime.get(Calendar.AM_PM) != Calendar.AM) { 
         timePicker.setCurrentHour(hour); 

         if (minute > min) { 
          timePicker.setCurrentMinute(min); 

         } 
        } 


       } else if (selected_month != month | selected_day != today | selected_year != year) { 

       } else if (hourOfDay == hour && minute > min) { 
        timePicker.setCurrentMinute(min); 
       } else if (hourOfDay > hour) { 
        timePicker.setCurrentHour(hour); 

        if (minute > min) { 
         timePicker.setCurrentMinute(min); 

        } 
       } 
       // 
       isTimePickerChanged = true; 
       String AM_PM; 
       if (hourOfDay < 12) { 
        AM_PM = "AM"; 
       } else { 
        AM_PM = "PM"; 
       } 

       //to set as 12 hour 
       time_format = (hourOfDay + ":" + minute + ":" + "00"); 

       if (hourOfDay > 12) { 
        hourOfDay = (hourOfDay - 12); 
       } 

       st_time = (hourOfDay + ":" + pad(minute) + " " + AM_PM); 

       mIsOnTimeChanged = false; 

      } 


     } 
    }); 
0

आप केवल कस्टम टाइमपिकर का उपयोग मूल्यों को सेट करने के लिए प्रतिबिंबित कर सकते हैं।

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 

    try { 
     Class<?> classForid = Class.forName("com.android.internal.R$id"); 
     Field field = classForid.getField("minute"); 

     NumberPicker mMinuteSpinner = (NumberPicker) findViewById(field.getInt(null)); 
     mMinuteSpinner.setMinValue(5); 
     mMinuteSpinner.setMaxValue((60/timeInterval) - 1); 

     List<String> displayedValues = new ArrayList<>(); 
     for (int i = 0; i < 60; i += timeInterval) 
      displayedValues.add(String.format("%02d", i)); 
     mMinuteSpinner.setDisplayedValues(displayedValues.toArray(new String[0])); 

     mMinuteSpinner.setWrapSelectorWheel(true); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

तो आप क्या आप

2

चाहते lolipop और आप इस संशोधित RangeTimePickerDialog वर्ग का उपयोग कर सकते एंड्रॉयड के उच्च संस्करण के लिए मान सेट कर सकते हैं

(lolipop से, Timepicker घड़ी मोड (सामग्री डिजाइन) के रूप में उपयोग करता है डिफ़ॉल्ट है कि पुराना कस्टमक्लास काम नहीं करेगा। हम मोड को नवीनतम संस्करण के लिए स्पिनर में बदल सकते हैं और कक्षा का पुन: उपयोग कर सकते हैं)

public class RangeTimePickerDialog extends TimePickerDialog { 

    private int minHour = -1; 
    private int minMinute = -1; 

    private int maxHour = 25; 
    private int maxMinute = 25; 

    private int currentHour = 0; 
    private int currentMinute = 0; 

    private Calendar calendar = Calendar.getInstance(); 
    private DateFormat dateFormat; 


    public RangeTimePickerDialog(Context context, int dialogTheme, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) { 
     super(context, callBack, hourOfDay, minute, is24HourView); 
     currentHour = hourOfDay; 
     currentMinute = minute; 
     dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT); 
     fixSpinner(context, hourOfDay, minute, is24HourView); 

     try { 
      Class<?> superclass = getClass().getSuperclass(); 
      Field mTimePickerField = superclass.getDeclaredField("mTimePicker"); 
      mTimePickerField.setAccessible(true); 
      TimePicker mTimePicker = (TimePicker) mTimePickerField.get(this); 
      mTimePicker.setOnTimeChangedListener(this); 
     } catch (NoSuchFieldException e) { 
     } catch (IllegalArgumentException e) { 
     } catch (IllegalAccessException e) { 
     } 
    } 

    public void setMin(int hour, int minute) { 
     minHour = hour; 
     minMinute = minute; 
    } 

    public void setMax(int hour, int minute) { 
     maxHour = hour; 
     maxMinute = minute; 
    } 

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

     boolean validTime = true; 
     if (hourOfDay < minHour || (hourOfDay == minHour && minute < minMinute)){ 
      validTime = false; 
     } 

     if (hourOfDay > maxHour || (hourOfDay == maxHour && minute > maxMinute)){ 
      validTime = false; 
     } 

     if (validTime) { 
      currentHour = hourOfDay; 
      currentMinute = minute; 
     } 

     updateTime(currentHour, currentMinute); 
     updateDialogTitle(view, currentHour, currentMinute); 
    } 

    private void updateDialogTitle(TimePicker timePicker, int hourOfDay, int minute) { 
     calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); 
     calendar.set(Calendar.MINUTE, minute); 
     String title = dateFormat.format(calendar.getTime()); 
     setTitle(title); 
    } 


    private void fixSpinner(Context context, int hourOfDay, int minute, boolean is24HourView) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // android:timePickerMode spinner and clock began in Lollipop 
      try { 
       // Get the theme's android:timePickerMode 
       //two modes are available clock mode and spinner mode ... selecting spinner mode for latest versions 
       final int MODE_SPINNER = 2; 
       Class<?> styleableClass = Class.forName("com.android.internal.R$styleable"); 
       Field timePickerStyleableField = styleableClass.getField("TimePicker"); 
       int[] timePickerStyleable = (int[]) timePickerStyleableField.get(null); 
       final TypedArray a = context.obtainStyledAttributes(null, timePickerStyleable, android.R.attr.timePickerStyle, 0); 
       Field timePickerModeStyleableField = styleableClass.getField("TimePicker_timePickerMode"); 
       int timePickerModeStyleable = timePickerModeStyleableField.getInt(null); 
       final int mode = a.getInt(timePickerModeStyleable, MODE_SPINNER); 
       a.recycle(); 
       if (mode == MODE_SPINNER) { 
        TimePicker timePicker = (TimePicker) findField(TimePickerDialog.class, TimePicker.class, "mTimePicker").get(this); 
        Class<?> delegateClass = Class.forName("android.widget.TimePicker$TimePickerDelegate"); 
        Field delegateField = findField(TimePicker.class, delegateClass, "mDelegate"); 
        Object delegate = delegateField.get(timePicker); 
        Class<?> spinnerDelegateClass; 
        if (Build.VERSION.SDK_INT != Build.VERSION_CODES.LOLLIPOP) { 
         spinnerDelegateClass = Class.forName("android.widget.TimePickerSpinnerDelegate"); 
        } else { 

         spinnerDelegateClass = Class.forName("android.widget.TimePickerClockDelegate"); 
        } 
        if (delegate.getClass() != spinnerDelegateClass) { 
         delegateField.set(timePicker, null); // throw out the TimePickerClockDelegate! 
         timePicker.removeAllViews(); // remove the TimePickerClockDelegate views 
         Constructor spinnerDelegateConstructor = spinnerDelegateClass.getConstructor(TimePicker.class, Context.class, AttributeSet.class, int.class, int.class); 
         spinnerDelegateConstructor.setAccessible(true); 
         // Instantiate a TimePickerSpinnerDelegate 
         delegate = spinnerDelegateConstructor.newInstance(timePicker, context, null, android.R.attr.timePickerStyle, 0); 
         delegateField.set(timePicker, delegate); // set the TimePicker.mDelegate to the spinner delegate 
         // Set up the TimePicker again, with the TimePickerSpinnerDelegate 
         timePicker.setIs24HourView(is24HourView); 
         timePicker.setCurrentHour(hourOfDay); 
         timePicker.setCurrentMinute(minute); 
         timePicker.setOnTimeChangedListener(this); 
        } 
       } 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
     } 
    } 
    private static Field findField(Class objectClass, Class fieldClass, String expectedName) { 
     try { 
      Field field = objectClass.getDeclaredField(expectedName); 
      field.setAccessible(true); 
      return field; 
     } catch (NoSuchFieldException e) {} // ignore 
     // search for it if it wasn't found under the expected ivar name 
     for (Field searchField : objectClass.getDeclaredFields()) { 
      if (searchField.getType() == fieldClass) { 
       searchField.setAccessible(true); 
       return searchField; 
      } 
     } 
     return null; 
    } 
} 
संबंधित मुद्दे