0

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

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

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

在此处输入图像描述

那么时间输出应该显示这个: 在此处输入图像描述

这是我的代码:

    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 的更改似乎也只发生在用户旋转右侧的数字(分钟)时,如果他们旋转左侧的数字(小时)也应该发生更改

4

2 回答 2

1

这是因为您没有设置onValueChangeListenermHourSpinner. 试试这个:

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()]);
}
  
于 2020-12-20T07:34:41.720 回答
0

根本原因

  • 当您选择 时mHourSpinner,没有任何反应,因为您忘记调用setOnValueChangedListener它。

  • getValue()只是返回Picker未显示值的值,您必须使用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);
}
于 2020-12-20T08:30:49.923 回答