2014-11-14 16 views
16

मुझे एपीआई 21 पर TimePicker विजेट के साथ कोई समस्या है। एपीआई 1 9 TimePicker आईओएस की तरह ऊपर/नीचे सूची थी, लेकिन 21+ में यह एक जैसा है कैलेंडर ऐप।एंड्रॉइड एपीआई 21 - टाइमपिकर विजेट

मैं 21+ में पुराने का उपयोग कैसे कर सकता हूं, क्योंकि यह मेरा डिज़ाइन तोड़ता है, अगर यह नया विजेट है।

+0

मैं एक प्रोग्राम के द्वारा और एक्सएमएल जवाब के लिए इस stackoverflow लिंक की सिफारिश: http://stackoverflow.com/questions/24449723/is-it-possible-to-change-the-style-of-an-android- l-timepickerdialog – Zhang

उत्तर

39

आप "स्पिनर" को टाइम पिकरोड विशेषता को सेट करके स्पिनर-स्टाइल टाइम पिकर निर्दिष्ट कर सकते हैं। सामग्री पर डिफ़ॉल्ट मान "घड़ी" है।

<TimePicker 
    ... 
    android:timePickerMode="spinner" /> 
+3

यह प्रोग्रामेटिक तरीके से कैसे किया जाएगा? –

+1

जब आप अपना टाइम पिकर बनाते हैं तो आप defStyleAttr या defStyleRes को पास कर सकते हैं। – alanv

+0

क्या प्री-लॉलीपॉप पर इस नए एपीआई 21 टाइमपिकर का उपयोग करना संभव है? – fpopic

0

आप कस्टम क्लास का उपयोग करके प्रोग्रामर रूप से स्पिनर मोड का उपयोग कर सकते हैं। पिछले संस्करणों के लिए लॉलीपॉप से ​​यह टाइमपिकर मोड को घड़ी से स्पिनर में बदल देगा और यह आपको किसी विशेष समय के बाद अक्षम समय सेट करने की अनुमति देता है (सेटमैक्स() & setmin() का उपयोग करके। नीचे दिए गए कोड में मैंने अधिकतम समय सीमित करने के लिए अधिकतम() सेट किया था।

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; 
    } 
} 
+0

प्रतिबिंब का उपयोग भविष्य की बचत नहीं है। मैं इसका उपयोग नहीं करता। – mars3142

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