【问题标题】:How to set start time and end time with an interval of 30 minutes in TimePicker Android?如何在 TimePicker Android 中以 30 分钟为间隔设置开始时间和结束时间?
【发布时间】:2011-12-24 06:13:44
【问题描述】:

我正在开发 Android 中的 DatePicker 和 TimePicker。我正在从服务器获取开始时间和时间。我可以使用this link 以编程方式设置最大日期和最小日期

我想在 timepicker 中设置最小时间 (07:00) 和最大时间 (10:00) 并保持 30 分钟的间隔。我尝试使用This Link

我需要的是设置 timepicket 最小 07:00 和最大时间 =10:00 和间隔 07:00,07:30, 08:00 等

这里是相同的代码`

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    TimePicker pn = (TimePicker) findViewById(R.id.tp_powernap);

    pn.setCurrentHour(7);
    pn.setCurrentMinute(0);
    System.out.println("timepicker erstellt");
    pn.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
    System.out.println("Tastatur geblockt");
    pn.setOnTimeChangedListener(StartTimeChangedListener);
    System.out.println("starttimechangedlistener");
    pn.setIs24HourView(false);
}


private TimePicker.OnTimeChangedListener StartTimeChangedListener =
    new TimePicker.OnTimeChangedListener() {

    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
        updateDisplay(view, hourOfDay, minute);          
    }
};

private TimePicker.OnTimeChangedListener NullTimeChangedListener =
    new TimePicker.OnTimeChangedListener() {

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

    }
};



private void updateDisplay(TimePicker timePicker, int hourOfDay, int minute) {
    int nextMinute = 0;
    timePicker.setOnTimeChangedListener(NullTimeChangedListener);
    if (minute >= 45 && minute <= 59) 
        nextMinute = 45;  
    else if (minute  >= 30) 
        nextMinute = 30;
    else if (minute >= 15) 
        nextMinute = 15;
    else if (minute > 0) 
        nextMinute = 0; 
    else { 
        nextMinute = 45; 
    }

    if (minute - nextMinute == 1) {
        if (minute >= 45 && minute <= 59) 
            nextMinute = 00; 
        else if(minute  >= 30) 
            nextMinute = 45;
        else if(minute >= 15) 
            nextMinute = 30;
        else if(minute > 0) 
            nextMinute = 15; 
        else { 
            nextMinute = 15; 
        }
    }

    timePicker.setCurrentMinute(nextMinute);

    timePicker.setOnTimeChangedListener(StartTimeChangedListener);

}

【问题讨论】:

    标签: android


    【解决方案1】:

    仅供参考(这是一个老问题)。可以使用以下 hack 来实现间隔:

    Class<?> classForid = Class.forName("com.android.internal.R$id");
    Field field = classForid.getField("minute");
    
    NumberPicker mMinuteSpinner = (NumberPicker) timePicker
                        .findViewById(field.getInt(null));
    mMinuteSpinner.setMinValue(0);
    mMinuteSpinner.setMaxValue((60 / TIME_PICKER_INTERVAL) - 1);
    List<String> displayedValues = new ArrayList<String>();
    for (int i = 0; i < 60; i += TIME_PICKER_INTERVAL) {
        displayedValues.add(String.format("%02d", i));
    }
    mMinuteSpinner.setDisplayedValues(displayedValues
                        .toArray(new String[0]));
    

    另见here

    可以以类似的方式设置开始时间和结束时间,但 AM/PM 标志存在问题。如果您不使用 am/pm 而是始终以 24 小时格式显示时间,您的问题就解决了 ;-)

            if (startHour != -1 && endHour != -1) {
                Field field = classForid.getField("hour");
                NumberPicker hourSpinner = (NumberPicker) timePicker
                        .findViewById(field.getInt(null));
                hourSpinner.setMinValue(startHour);
                hourSpinner.setMaxValue(endHour);
                List<String> displayedValues = new ArrayList<String>();
                if (timePicker.is24HourView()) {
                    for (int i = startHour; i <= endHour; ++i) {
                        displayedValues.add(String.format("%02d", i));
                    }
                } else {
                    for (int i = startHour; i <= 12; ++i) {
                        displayedValues.add(String.format("%d", i));
                    }
                    for (int i = 1; i <= endHour % 12; ++i) {
                        displayedValues.add(String.format("%d", i));
                    }
                }
                hourSpinner.setDisplayedValues(displayedValues
                        .toArray(new String[0]));
            }
    

    【讨论】:

      【解决方案2】:

      试试这个代码。

      import android.content.Context
      import android.util.AttributeSet
      import android.widget.NumberPicker
      import android.widget.TimePicker
      import androidx.databinding.BindingAdapter
      import java.lang.reflect.Field
      import java.util.*
      
      
      class TimePickerInterval @JvmOverloads constructor(
              context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
      ) : TimePicker(context, attrs, defStyleAttr) {
      
          private var MINUTE_INTERVAL = 1
          private var MIN_MINUTE= 0
          private var MAX_MINUTE = 60
          override fun getCurrentMinute(): Int {
              return super.getCurrentMinute() * MINUTE_INTERVAL
          }
      
          override fun getMinute(): Int {
              return super.getMinute() * MINUTE_INTERVAL
          }
      
          override fun onAttachedToWindow() {
              super.onAttachedToWindow()
              setUp()
          }
      
          private fun setUp() {
              try {
                  val classForid = Class.forName("com.android.internal.R\$id")
                  val field: Field = classForid.getField("minute")
                  val mMinuteSpinner = findViewById<NumberPicker>(field.getInt(null))
                  mMinuteSpinner.minValue = MIN_MINUTE
                  mMinuteSpinner.maxValue = MAX_MINUTE / MINUTE_INTERVAL - 1
                  val displayedValues: MutableList<String> = ArrayList()
                  var i = 0
                  while (i < 60) {
                      displayedValues.add(String.format("%02d", i))
                      i += MINUTE_INTERVAL
                  }
                  mMinuteSpinner.displayedValues = displayedValues.toTypedArray()
      
              } catch (e: Exception) {
                  e.printStackTrace()
              }
          }
      
          override fun setOnTimeChangedListener(onTimeChangedListener: OnTimeChangedListener) {
              super.setOnTimeChangedListener { tp, hour, minute ->
                  onTimeChangedListener.onTimeChanged(tp, hour, minute * MINUTE_INTERVAL)
              }
          }
      
          override fun setMinute(minute: Int) {
              super.setMinute(minute / MINUTE_INTERVAL)
          }
          fun setMinMinute(min: Int) {
              MIN_MINUTE = min
              setUp()
          }
          fun setMaxMinute(max: Int) {
              MAX_MINUTE = max
              setUp()
          }
         fun setMinuteInterval(interval: Int) {
              MINUTE_INTERVAL = interval
              setUp()
          }
      
          companion object {
              @JvmStatic
              @BindingAdapter("time_picker_set_minute_interval")
              fun setMinuteInterval(view: TimePickerInterval, interval: Int?) {
                  interval?.let {
                      view.setMinuteInterval(it)
                  }
              }
          }
      }
      

      【讨论】: