【问题标题】:android studio 30 min interval on time picker(spinner)android studio 30 分钟间隔时间选择器(微调器)
【发布时间】:2020-12-16 13:41:14
【问题描述】:

我正在使用时间选择器微调器。我想实施 30 分钟的间隔。
我使用的代码会输出这种效果,如下图所示。

代码如下:

picker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
    @Override
    public void onTimeChanged(TimePicker view, int hour, int min) {

        timeoutput.setText(String.format("%02dh%02d", hour, min));
    }
});

back.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(Schedule.this, choosewalk.class);
        startActivity(intent);
    }
});

@SuppressLint("DefaultLocale")
private void TimeInterval(TimePicker picker) {
    try {
        int Interval = 30;
        NumberPicker minute = (NumberPicker) picker.findViewById(Resources.getSystem().getIdentifier(
            "minute", "id", "android"));
        minute.setMinValue(0);
        minute.setMaxValue((60 / Interval) - 1);
        List<String> displayedValue = new ArrayList<String>();
        for (int i = 0; i < 60; i += Interval) {
            displayedValue.add(String.format("%02d", i));
        }
        minute.setDisplayedValues(displayedValue.toArray(new String[0]));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我知道有类似的问题,但是对于这个特定的问题,我很挣扎。我知道该方法适用于 5、10、15 等间隔。它以 30 分钟的间隔更改代码是有问题的。

【问题讨论】:

  • 你遇到了什么问题?
  • 嗨。我已经看过演示时间选择器(微调器)的教程和示例代码,计数为 5、10 15。如果我为 5 分钟的间隔分配 5,我的时间选择器工作正常。但我想要 30 分钟的间隔。你在上图中看到,当我分配 30 的间隔时,它只显示 0、30,并且停止计数。这是我想要解决的问题。
  • @MrAndroid 计数器被设计为上升到 60。你的输出上升到 60。有什么问题?
  • 对不起,如果我现在听起来很愚蠢,请原谅我,但是我知道你在说什么。我只是不知道如何让它默认为 00 并继续像 00、30、60 一样重复。乍一看,这对我来说似乎很简单,但我尝试更改代码并一直失败。
  • 只需将i &lt; 60中的边界更改为更大的数字即可。

标签: java android android-studio kotlin timepicker


【解决方案1】:

好的,这是你的问题。你想要一个带有0030 的轮子,并且你希望能够无限滚动它,所以它会从30 切换到00 并且每次都会增加小时轮,对吗?这基本上是TimePicker 默认的工作方式。

问题是这样的,来自NumberPicker

注意:如果项目数,即范围 (getMaxValue() - getMinValue()) 小于选择轮上显示的项目数,则选择轮不会换行。

max - min 是一种非常尴尬的表达方式(项目数实际上是 that + 1) - 但基本上微调器显示 一次在屏幕上显示三个 项,并且您需要有三个以上 项(因此至少一个在屏幕外)才能进行换行。这就是为什么它适用于您的其他时间间隔(15 分钟为您提供四项,以便换行)

不幸的是,我认为您对此无能为力 - 缺少包装是 NumberPicker 中的硬编码行为。您可以通过拥有四个项目来伪造它,00300030 但在内部,这仍然是值 03,轮子旋转一圈,而不是两圈。 TimePicker 使用这些值,与 minValuemaxValue 进行比较,以检查车轮何时缠绕以及小时需要自动更改。

无法读取处理此问题的侦听器(在 TimePickerSpinnerDelegate 中),因此您不能将其包装在假装它正在运行的侦听器中 0 1 0 1 代替。侦听器还引用了一堆内部私有变量和方法,因此您不能只是将其复制到自己的代码中并进行调整。您必须通过外观重新实现整个小部件及其相关类


如果它适合您,您可以将两个 NumberPickers 放在一起并自己重新制作。您将失去诸如 AM/PM 功能之类的东西,可能是可访问性,这取决于您是否关心。这基本上有效:

public class MainActivity extends AppCompatActivity implements NumberPicker.OnValueChangeListener {

    private NumberPicker mMinuteSpinner;
    private NumberPicker mHourSpinner;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMinuteSpinner = findViewById(R.id.minPicker);
        mHourSpinner = findViewById(R.id.hourPicker);
        
        mMinuteSpinner.setMinValue(0);
        mMinuteSpinner.setMaxValue(3);
        mMinuteSpinner.setDisplayedValues(new String[]{"00", "30", "00", "30"});
        mMinuteSpinner.setOnValueChangedListener(this);

        mHourSpinner.setMinValue(0);
        mHourSpinner.setMaxValue(23);
        String[] hours = new String[24];
        for (int i = 0; i < 24; i++) {
            hours[i] = Integer.toString(i + 1);
        }
        mHourSpinner.setDisplayedValues(hours);
    }

    @Override
    public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
        boolean advanced = (newVal == 0 && oldVal == 3) || (newVal == 2 && oldVal == 1);
        boolean regressed = (newVal == 3 && oldVal == 0) || (newVal == 1 && oldVal == 2);
        if (advanced) {
            mHourSpinner.setValue(mHourSpinner.getValue() + 1);
        } else if (regressed) {
            mHourSpinner.setValue(mHourSpinner.getValue() - 1);
        }
    }

}

好久没接触Java了!可能有更好的方法来做到这一点。但是,是的,侦听器只是检查它是否在四项列表上的两个翻转点之间传递(它从3000 以一种方式滚动,反之亦然,以另一种方式滚动)。这基本上就是TimePicker 的工作原理

【讨论】:

  • 谢谢伙计。有用。现在只是无法将值输出到 textview。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
相关资源
最近更新 更多