2016-07-22 15 views
1

Ich war ein Timepicker mit einem winzigen Intervall von this Antwort. Ich lief dies auf einem Andorid N Preview 5 Emulator und anscheinend wurde die THEME_HOLO_LIGHTTimepicker entfernt.Android N, L und unter Zeitpicker mit Minutenintervall

Wie kann ich eine Timepicker mit Minutenintervallen haben? Es scheint mir nicht sehr wahrscheinlich, dass es wieder in der endgültigen Version von Android N sein wird.

+0

ein Erstellen Sie sich 'NumberPicker' verwenden. Oder, [finden Sie eine Bibliothek, die eine Auswahl hat, die Ihren Bedürfnissen entspricht] (http://android-arsenal.com/tag/27). – CommonsWare

Antwort

1

In der Tat war die Erstellung meines eigenen Zeitnehmers die Lösung. Ich posten meine Lösung unten für andere. Dies erzeugt einen Zeitpicker-Dialog mit Minutenintervallen für API 14 und höher. Es funktioniert für Intervalle von 1,5 und 15. Andere Werte können ebenfalls funktionieren.

Verbrauch:

Dialog intervalTimePickerDialog = IntervalTimePickerDialogFactory.getIntervalTimePickerDialog(Context context, int positiveTextId, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView, final int interval); 
intervalTimePickerDialog .show(); 

denke ich, es nicht viel Erklärung benötigen. int positiveTextId kann entfernt werden, es war nur etwas, was ich brauchte.

timepickerdialog.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <TimePicker 
     android:timePickerMode="spinner" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/timePicker" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" /> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/timePicker" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true"> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Cancel" 
      style="?android:attr/borderlessButtonStyle" 
      android:id="@+id/buttonNegative" /> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Inklokken" 
      style="?android:attr/borderlessButtonStyle" 
      android:id="@+id/buttonPositive" /> 
    </LinearLayout> 
</RelativeLayout> 

Code:

public class IntervalTimePickerDialogFactory { 
    public static Dialog getIntervalTimePickerDialog(Context context, int positiveTextId, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView, final int interval){ 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ 
      return new LIntervalTimePickerDialog(context, positiveTextId, callBack, hourOfDay, minute, is24HourView, interval); 
     }else{ 
      return new IntervalTimePickerDialog(context, positiveTextId, callBack, hourOfDay, minute, is24HourView, interval); 
     } 
    } 

    private static class IntervalTimePickerDialog extends TimePickerDialog { 

     private TimePicker timePicker; 
     private final OnTimeSetListener callback; 
     private int interval; 

     public IntervalTimePickerDialog(Context context, int positiveTextId, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView, final int interval) { 

      super(context, TimePickerDialog.THEME_HOLO_LIGHT, callBack, hourOfDay, ((int)Math.ceil((double)minute/(double)interval)), is24HourView); 
      this.interval = interval; 

      this.callback = callBack; 

      this.setButton(BUTTON_POSITIVE, context.getResources().getString(positiveTextId), new OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        if (callback != null && timePicker != null) { 
         timePicker.clearFocus(); 
         callback.onTimeSet(timePicker, timePicker.getCurrentHour(), 
           timePicker.getCurrentMinute() * interval); 
        } 
       } 
      }); 
      this.setButton(BUTTON_NEGATIVE, context.getResources().getString(R.string.annuleren), new OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dismiss(); 
       } 
      }); 
     } 


     @Override 
     protected void onStop() { 
     } 

     @Override 
     public void onAttachedToWindow() { 
      super.onAttachedToWindow(); 
      try { 
       Class<?> classForid = Class.forName("com.android.internal.R$id"); 
       Field timePickerField = classForid.getField("timePicker"); 
       this.timePicker = (TimePicker) findViewById(timePickerField 
         .getInt(null)); 
       Field field = classForid.getField("minute"); 

       NumberPicker mMinuteSpinner = (NumberPicker) timePicker 
         .findViewById(field.getInt(null)); 
       mMinuteSpinner.setMinValue(0); 
       mMinuteSpinner.setMaxValue((60/interval) - 1); 
       List<String> displayedValues = new ArrayList<>(); 
       for (int i = 0; i < 60; i += interval) { 
        displayedValues.add(String.format("%02d", i)); 
       } 
       mMinuteSpinner.setDisplayedValues(displayedValues 
         .toArray(new String[0])); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

    private static class LIntervalTimePickerDialog extends Dialog{ 
     private static final DecimalFormat FORMATTER = new DecimalFormat("00"); 
     private final TimePickerDialog.OnTimeSetListener callback; 
     private int interval; 
     private TimePicker timePicker; 
     private NumberPicker minutePicker; 

     public LIntervalTimePickerDialog(Context context, int positiveTextId, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView, final int interval) { 
      super(context); 
      setContentView(R.layout.timepickerdialog); 
      timePicker = (TimePicker) findViewById(R.id.timePicker); 
      timePicker.setIs24HourView(is24HourView); 
      timePicker.setCurrentHour(hourOfDay); 

      this.callback = callBack; 
      this.interval = interval; 

      Button buttonPositive = (Button) findViewById(R.id.buttonPositive); 
      buttonPositive.setText(positiveTextId); 
      buttonPositive.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        if (callback != null && timePicker != null) { 
         timePicker.clearFocus(); 
         callback.onTimeSet(timePicker, timePicker.getCurrentHour(), 
           timePicker.getCurrentMinute() * interval); 
        } 
        dismiss(); 
       } 
      }); 

      Button buttonNegative = (Button) findViewById(R.id.buttonNegative); 
      buttonNegative.setText(context.getResources().getString(R.string.annuleren)); 
      buttonNegative.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        dismiss(); 
       } 
      }); 

      setMinutePicker(); 
      timePicker.setCurrentMinute((int) Math.ceil((double) minute/(double) interval)); 
     } 

     public void setMinutePicker() { 
      int numValues = 60/interval; 
      String[] displayedValues = new String[numValues]; 
      for (int i = 0; i < numValues; i++) { 
       displayedValues[i] = FORMATTER.format(i * interval); 
      } 

      View minute = timePicker.findViewById(Resources.getSystem().getIdentifier("minute", "id", "android")); 
      if ((minute != null) && (minute instanceof NumberPicker)) { 
       minutePicker = (NumberPicker) minute; 
       minutePicker.setMinValue(0); 
       minutePicker.setMaxValue(numValues - 1); 
       minutePicker.setDisplayedValues(displayedValues); 
      } 
     } 
    } 
}