NumberPicker 上的 setMinValue 没有 select 正确的最小值
setMinValue on NumberPicker doesn't select the correct min value
我想创建一个带有显示值数组的 NumberPicker。当显示 NumberPicker 时,这些值不应更改,但最小值和最大值会根据用户操作动态更改。
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<NumberPicker
android:id="@+id/picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
</RelativeLayout>
主要Activity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String[] values = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
NumberPicker picker = (NumberPicker) findViewById(R.id.picker);
picker.setDisplayedValues(values);
picker.setMaxValue(7);
picker.setMinValue(3);
picker.setWrapSelectorWheel(false);
}
}
当我设置最大值而不设置最小值时,我以“0”和“7”(包括)之间的显示值结束。如果我将 minValue 设置为 0,我会有相同的行为。
但是,如果我将 minValue 设置为 3,我将以“0”和“4”之间的显示值结束。当它应该在“3”和“7”之间时。
我不明白为什么。是我做错了什么还是组件有问题?
从the documentation可以解释。
当您设置最小值和最大值时,您定义了可以使用 NumberPicker
输入的整数值。所以 setValue(int)
只接受从最小值到最大值的值。
displayValues()
是标签覆盖。它将以下一种方式使用 - NumberPicker
将采用索引为 value - min
的标签。
如果您查看 setMinValue 或 setMaxValue 的实现,会有一条评论说:
* <strong>Note:</strong> The length of the displayed values array
* set via {@link #setDisplayedValues(String[])} must be equal to the
* range of selectable numbers which is equal to
* {@link #getMaxValue()} - {@link #getMinValue()} + 1.
因此,要解决此问题,最好在要更新显示值时设置值列表。
//do this once in onCreate and save the values list somewhere where you have access
final List<String> values = new ArrayList<>();
for (int i = 0; i < 10; ++i) {
values.add(String.valueOf(i));
}
NumberPicker picker = (NumberPicker) findViewById(R.id.picker);
picker.setWrapSelectorWheel(false);
//do this every time you want to change the displayed values and set minValue and maxValue accordingly
//also make sure that you stay within the bounds of value
int minValue = 3;
int maxValue = 7;
final List<String> subValues = values.subList(minValue, maxValue + 1);
String[] subValuesArray = new String[subValues.size()];
subValuesArray = subValues.toArray(subValuesArray);
picker.setDisplayedValues(subValuesArray);
picker.setMinValue(0);
picker.setMaxValue(subValues.size() - 1);
为了@Bmuig 的回答简洁,只是一个辅助函数:
private void configurePicker(NumberPicker picker, ArrayList<String> values, int minValue, int maxValue, int currentValue) {
picker.setDisplayedValues(values) //to avoid out of bounds
picker.setMinValue(minValue);
picker.setMaxValue(maxValue);
picker.setValue(currentValue);
picker.setDisplayedValues((String[]) values.subList(minValue, maxValue + 1).toArray());
}
我想创建一个带有显示值数组的 NumberPicker。当显示 NumberPicker 时,这些值不应更改,但最小值和最大值会根据用户操作动态更改。
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<NumberPicker
android:id="@+id/picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
</RelativeLayout>
主要Activity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String[] values = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
NumberPicker picker = (NumberPicker) findViewById(R.id.picker);
picker.setDisplayedValues(values);
picker.setMaxValue(7);
picker.setMinValue(3);
picker.setWrapSelectorWheel(false);
}
}
当我设置最大值而不设置最小值时,我以“0”和“7”(包括)之间的显示值结束。如果我将 minValue 设置为 0,我会有相同的行为。 但是,如果我将 minValue 设置为 3,我将以“0”和“4”之间的显示值结束。当它应该在“3”和“7”之间时。
我不明白为什么。是我做错了什么还是组件有问题?
从the documentation可以解释。
当您设置最小值和最大值时,您定义了可以使用 NumberPicker
输入的整数值。所以 setValue(int)
只接受从最小值到最大值的值。
displayValues()
是标签覆盖。它将以下一种方式使用 - NumberPicker
将采用索引为 value - min
的标签。
如果您查看 setMinValue 或 setMaxValue 的实现,会有一条评论说:
* <strong>Note:</strong> The length of the displayed values array * set via {@link #setDisplayedValues(String[])} must be equal to the * range of selectable numbers which is equal to * {@link #getMaxValue()} - {@link #getMinValue()} + 1.
因此,要解决此问题,最好在要更新显示值时设置值列表。
//do this once in onCreate and save the values list somewhere where you have access
final List<String> values = new ArrayList<>();
for (int i = 0; i < 10; ++i) {
values.add(String.valueOf(i));
}
NumberPicker picker = (NumberPicker) findViewById(R.id.picker);
picker.setWrapSelectorWheel(false);
//do this every time you want to change the displayed values and set minValue and maxValue accordingly
//also make sure that you stay within the bounds of value
int minValue = 3;
int maxValue = 7;
final List<String> subValues = values.subList(minValue, maxValue + 1);
String[] subValuesArray = new String[subValues.size()];
subValuesArray = subValues.toArray(subValuesArray);
picker.setDisplayedValues(subValuesArray);
picker.setMinValue(0);
picker.setMaxValue(subValues.size() - 1);
为了@Bmuig 的回答简洁,只是一个辅助函数:
private void configurePicker(NumberPicker picker, ArrayList<String> values, int minValue, int maxValue, int currentValue) {
picker.setDisplayedValues(values) //to avoid out of bounds
picker.setMinValue(minValue);
picker.setMaxValue(maxValue);
picker.setValue(currentValue);
picker.setDisplayedValues((String[]) values.subList(minValue, maxValue + 1).toArray());
}