在 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);
}
我创建了两个数字选择器来伪装成时间选择器,目的很简单,可以重复旋转 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);
}