在 textview 上显示两个数字选择器

Display two number pickers on textview

我创建了两个数字选择器来伪装成时间选择器,目的很简单,可以重复旋转 0 - 30,这很有效。

但现在我想将这两个数字选择器显示到文本视图中。

因此,如果数字选择器显示下图中的内容:

enter image description here

那么时间输出应该显示如下: enter image description here

这是我的代码:

    public void timepicker() {

        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] = String.format("%02d", i );
        }
        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);
        }

我还尝试了以下变体:

        timeoutput.setText("" + mHourSpinner.getValue() + "h" + mMinuteSpinner.getValue());

但是没有用。 getvalue好像获取的是数字的位置,而不是实际的数字。

显示 textview 的更改似乎也只发生在用户向右旋转数字(分钟)时,如果他们向左旋转数字(小时)也应该发生更改

这是因为您没有将 onValueChangeListener 设置为 mHourSpinner。 试试这个:

public void timepicker() {

    mMinuteSpinner.setMinValue(0);
    mMinuteSpinner.setMaxValue(3);
    mMinuteSpinner.setDisplayedValues(new String[]{"00", "30", "00", "30"});
    mMinuteSpinner.setOnValueChangedListener(this);
    mHourSpinner.setMinValue(0);
    mHourSpinner.setMaxValue(23);
    mHourSpinner.setOnValueChangedListener(this); // Add this line
    String[] hours = new String[24];
    for (int i = 0; i < 24; i++) {
        hours[i] = String.format("%02d", i );
    }
    mHourSpinner.setDisplayedValues(hours);
}

对于您的 onValueChangeListener,您无需从任何微调器读取 oldVal 和 newVal,而是直接从微调器获取值,如下所示:

@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
   //Remove the unnecessary lines and just update the value
   timeoutput.setText(mHourSpinner.getDisplayedValue()[mHourSpinner.getValue()] + "h" + mMinuteSpinner.getDisplayedValue()[mMinuteSpinner.getValue()]);
}
  

根本原因

  • 当您 select mHourSpinner 时,什么也没有发生,因为您忘记调用 setOnValueChangedListener 了。

  • getValue() just return the value of the Picker not displayed value, you must use getDisplayedValues() 这样做。

解决方法:将代码改为

public void timepicker() {
    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] = String.format("%02d", i);
    }
    mHourSpinner.setDisplayedValues(hours);
    mHourSpinner.setOnValueChangedListener(this);

    displaySelectedHourAndMinute();
}

@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
    displaySelectedHourAndMinute();
}

private void displaySelectedHourAndMinute() {
    String hour = mHourSpinner.getDisplayedValues()[mHourSpinner.getValue()];
    String minute = mMinuteSpinner.getDisplayedValues()[mMinuteSpinner.getValue()];
    timeoutput.setText(hour + "h" + minute);
}