【问题标题】:Timepicker with 15 minute intervals间隔 15 分钟的时间选择器
【发布时间】:2015-09-04 12:18:00
【问题描述】:

我有一个带有时间选择器和日期选择器的自定义对话框。我想将 timepicker 的分钟微调器集合设置为 [0, 15, 30, 45] 即 15 分钟间隔。

现在我看到了几种解决方案,但似乎都没有涵盖这样一个事实,即 UI 会将下一分钟和前一分钟显示为所选分钟的 -1 和 +1 分钟,例如向用户显示 29、30、31。

另外,我不清楚如何将自定义时间选择器附加到活动 - 我不需要 customerTimePicker xml 组件来执行此操作吗?

简而言之——我是调整本机时间选择器还是需要构建自定义 xml 和类?

我目前拥有的 布局:

<TimePicker
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/timePicker_fixture"
    android:layout_weight="1" />

活动

TimePicker timePicker_fixture = (TimePicker) dialog.findViewById(R.id.timePicker_fixture);
timePicker_fixture.setIs24HourView(true);

建议的自定义类(我如何使用它 - 我的布局中是否需要自定义 xml 组件?)

public class CustomTimePickerDialog extends TimePickerDialog {

    private final static int TIME_PICKER_INTERVAL = 15;
    private TimePicker timePicker;
    private final OnTimeSetListener callback;

    public CustomTimePickerDialog(Context context, OnTimeSetListener callBack,
                                  int hourOfDay, int minute, boolean is24HourView) {
        super(context, TimePickerDialog.THEME_HOLO_LIGHT, callBack, hourOfDay, minute / TIME_PICKER_INTERVAL,
                is24HourView);
        this.callback = callBack;
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (callback != null && timePicker != null) {
            timePicker.clearFocus();
            callback.onTimeSet(timePicker, timePicker.getCurrentHour(),
                    timePicker.getCurrentMinute() * TIME_PICKER_INTERVAL);
        }
    }

    @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 / 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]));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

【问题讨论】:

  • 你看过这里 - stackoverflow.com/questions/2580216/… 吗?
  • 好吧,这行得通:) 它有点....凌乱?我打算使用它,但我不明白 suppressLint("NewApi")
  • 只要去掉这个注解,你就会看到有错误的行(如果你的项目 api 级别低于“NewApi”)

标签: android layout custom-controls timepicker


【解决方案1】:

添加了以下内容

   @SuppressLint("NewApi")
    private void setTimePickerInterval(TimePicker timePicker) {
        try {
            Class<?> classForid = Class.forName("com.android.internal.R$id");
            // Field timePickerField = classForid.getField("timePicker");

            Field field = classForid.getField("minute");
            minutePicker = (NumberPicker) timePicker
                    .findViewById(field.getInt(null));

            minutePicker.setMinValue(0);
            minutePicker.setMaxValue(7);
            displayedValues = new ArrayList<String>();
            for (int i = 0; i < 60; i += TIME_PICKER_INTERVAL) {
                displayedValues.add(String.format("%02d", i));
            }
            for (int i = 0; i < 60; i += TIME_PICKER_INTERVAL) {
                displayedValues.add(String.format("%02d", i));
            }
            minutePicker.setDisplayedValues(displayedValues
                    .toArray(new String[0]));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

在我的活动中,然后从 oncreate() 调用此方法。当然你可以在任何需要的地方调用它。

【讨论】:

    【解决方案2】:

    上面的答案在Android 7 Nougat中对我不起作用,基本上日期选择器完全被时钟模式改变了......我将此代码与https://gist.github.com/jeffdgr8/6bc5f990bf0c13a7334ce385d482af9f合并,然后默认设置为TimePickerDialog 显示 Spinner 控件,然后运行代码以仅显示 15 分钟间隔。

    结果在这里:https://gist.github.com/smaugho/14dae83f3284fa05455ee0a9e4f13099

    【讨论】:

      【解决方案3】:
      /**
       * Set TimePicker interval by adding a custom minutes list
       *
       * @param timePicker
       */
      private void setTimePickerInterval(TimePicker timePicker) {
          try {
              int TIME_PICKER_INTERVAL = 15;
              NumberPicker minutePicker = (NumberPicker) timePicker.findViewById(Resources.getSystem().getIdentifier(
                      "minute", "id", "android"));
              minutePicker.setMinValue(0);
              minutePicker.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));
              }
              minutePicker.setDisplayedValues(displayedValues.toArray(new String[0]));
          } catch (Exception e) {
              Log.e(TAG, "Exception: " + e);
          }
      }
      

      【讨论】:

        【解决方案4】:
        timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener()
        {
            @Override
            public void onTimeChanged (TimePicker view, int hourOfDay, int minute)
            {
                view.setOnTimeChangedListener(null);
                int currentMinute = roundMinute(minute);
                view.setCurrentMinute(59);
                view.setCurrentMinute(currentMinute);
                view.setOnTimeChangedListener(this);
            }
        });
        
        private static int roundMinute (int minute)
        {
            return minute == 0 ? 0 : minute/5*5;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多