在 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()]);
}
  
,

根本原因

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

  • getValue() 只返回 Picker 未显示的值,您必须使用 getDisplayedValues() 来做到这一点。

解决方案:将您的代码更改为

public void timepicker() {
    mMinuteSpinner.setMinValue(0);
    mMinuteSpinner.setMaxValue(3);
    mMinuteSpinner.setDisplayedValues(new String[]{"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 newVal) {
    displaySelectedHourAndMinute();
}

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...