2016-07-22 2 views
1

Я использовал Timepicker с минутным интервалом от this. Я запустил это на эмуляторе Andorid N preview 5 и, видимо, был удален THEME_HOLO_LIGHTTimepicker.Android N, L и ниже timepicker с минутным интервалом

Как я могу получить Timepicker с небольшими интервалами? Мне кажется маловероятным, что он вернется в окончательную версию Android N.

+0

создать самостоятельно с помощью 'NumberPicker'. Или [найдите библиотеку, в которой есть подборщик, который соответствует вашим потребностям] (http://android-arsenal.com/tag/27). – CommonsWare

ответ

1

Действительно, создание моего собственного тайм-пикера было решением. Я отправляю свое решение ниже для других. Это создает диалоговое окно с временными интервалами для api 14 и выше. Он работает с интервалами 1,5 и 15. Другие значения также могут работать.

Использование:

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

Я думаю, что не нужно будет много объяснений. int positiveTextId можно удалить, это было то, что мне нужно.

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> 

Код:

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); 
      } 
     } 
    } 
}