Android NumberPicker在显示值更改时包装值

时间:2013-05-24 12:09:35

标签: java android numberpicker

我有一个内置3 Dialog的安卓numberpickers。更改第3个选择器会触发前2 pickers的显示值的更改。但是当我更改显示的值时,我注意到了,然后调用

setWrapSelectorWheel(false)

它仍然以可视方式显示新值(我可以看到第一个值之上的最后一个值)。

如果我触摸拾取器,它会突然卡入非包裹选择轮。奇怪的是我打电话

getWrapSelectoWheel()

设置显示的值后,它返回false ...就像我设置它一样。但在视觉上这是错误的。

任何想法发生了什么?

非常感谢!

3 个答案:

答案 0 :(得分:13)

我找到了一个解决方案,Daniel在正确的轨道上,但是一旦你已经设定了你的价值,initializeSelectorWheelIndices似乎是一件坏事。因此,您需要在设置值之前调用setMinValuesetMaxValue。但是,如果您的选择器上已经有一个数组,如果您使用比当前数组更高的值调用setMaxValue,它将为您提供ArrayIndexOutOfBounds例外。

然后解决方法是清除旧的显示值,设置最大值然后,您可以调用setWrapSelectorWheelsetDisplayValues

public void updatePickerValues(String[] newValues){
  picker.setDisplayedValues(null);
  picker.setMinValue(0);
  picker.setMaxValue(newValues.length -1);
  picker.setWrapSelectorWheel(false);
  picker.setDisplayedValues(newValues);
}

答案 1 :(得分:3)

我不知道您正在运行的Android版本,但我建议您阅读source code for the NumberPicker (v4.2.2)。也许您需要触发对私有方法initializeSelectorWheelIndices的调用,这可以通过调用某些公共方法来完成。

虽然我确实认为你对拾取器的使用,通过改变包装标志的一部分,似乎有点不寻常。你不希望这种行为保持一致吗?在这种情况下,在设置了最小值和最大值之后调用setWrapSelectorWheel,然后不管它。

答案 2 :(得分:1)

我已经在kitkat上验证了这种行为。这是一个错误。无法找到现有报告,因此我在此处创建了一个新报告:bug# 98319

根据之前的回答,我发现在所有设置调用之后进行最后一次调用的setWrapSelectorWheel(false)将适用于大多数情况。在我的情况下,我正在动态更改NumberPicker的限制,因为用户正在进行交互,我只是不能让它表现得100%。我选择使用换行选择器。