NumberPicker上的setMinValue没有选择正确的最小值

时间:2017-02-23 12:07:11

标签: android android-number-picker

我想创建一个带有显示值数组的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>

主要活动

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);
    }
}

当我设置最大值而不设置最小值时,我以&#34; 0&#34;之间的显示值结束。和&#34; 7&#34; (包括在内)。如果我将minValue设置为0,我会有相同的行为。 但是,如果我将minValue设置为3,则显示的值为&#34; 0&#34;和&#34; 4&#34;。如果它应该介于&#34; 3&#34;和&#34; 7&#34;。

我不明白为什么。我做错了什么或组件有问题吗?

3 个答案:

答案 0 :(得分:2)

如果你看一下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);

答案 1 :(得分:1)

可以从the documentation解释。

设置min和max时,可以定义可以使用NumberPicker输入的int值。因此setValue(int)只接受从最小到最大的值

displayValues()是标签覆盖。它将以下一种方式使用 - NumberPicker将使用索引value - min标记。

答案 2 :(得分:0)

为简洁起见@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());
}