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

pdtvr36n  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(329)

我做了一个创建了两个数字选取器来伪装成时间选取器的简单目的是能够重复旋转0-30,这是可行的。
但是现在我想在文本视图中显示这两个数字选择器。
因此,如果numberpickers显示了下图中的内容:
在此处输入图像描述
然后timeoutput应该显示:在这里输入图像描述
这是我的密码:

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似乎得到的是数字的位置,而不是实际的数字。
对显示文本视图的更改似乎也只发生在用户旋转右边的数字(分钟)时,如果用户旋转左边的数字(小时)时也应该发生更改

z5btuh9x

z5btuh9x1#

根本原因
当您选择 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);
}
f87krz0w

f87krz0w2#

这是因为你没有 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()]);
}

相关问题