问题描述
为了能够重复旋转 0 - 30 的简单目的,我创建了两个数字选择器来伪装成时间选择器。
那么时间输出应该显示: 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);
}