我只在android 4+上遇到此问题。当我尝试较低版本时,似乎工作正常。
我想在-30到30之间设置一个数字选择器。
我尝试这样做:
mypicker = (NumberPicker) findViewById(R.id.picker);
String[] values = new String[61];
for (int i = 0; i < 61; i++) {
int value = 30 - i;
values[i] = (value >= 0 ? "+ " : "- ") + Integer.toString(Math.abs(value));
}
mypicker.setMinValue(0);
mypicker.setMaxValue(60);
mypicker.setDisplayedValues(values);
mypicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
mypicker.setValue(30 - myValue);
除了一件奇怪的事情外,它还有效。当我选择1,2或3然后多次点击所选值时,它会将+1更改为+ 19,+ 2更改为+29,+ 3更改为+30。所有其他数字都可以。
任何人都可以帮我吗?我真的不知道为什么会这样,也不能谷歌任何答案。
答案 0 :(得分:1)
我看到了同样的问题。我正在实现一个自定义时间选择器,其中包含5分钟增量的分钟值(据我所知,这不能用库存时间选择器完成。)
对于左侧选择器,我将显示值初始化为: &#34; 12&#34;,&#34; 1&#34;,&#34; 2&#34;,&#34; 3&#34;,&#34; 4&#34;,&#34; 5& #34;,&#34; 6&#34;,&#34; 7&#34;,&#34; 8&#34;,&#34; 9&#34;,&#34; 10&#34;,& #34; 11&#34;
如果我将值设置为1(&#34; 1&#34;)并点按它,它会在&#34; 12&#34;之间切换。和&#34; 1&#34;。我已经分析了NumberPicker.onTouch代码,我看到了:
case MotionEvent.ACTION_UP: {
removeBeginSoftInputCommand();
removeChangeCurrentByOneFromLongPress();
mPressedStateHelper.cancel();
VelocityTracker velocityTracker = mVelocityTracker;
velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
int initialVelocity = (int) velocityTracker.getYVelocity();
if (Math.abs(initialVelocity) > mMinimumFlingVelocity) {
fling(initialVelocity);
onScrollStateChange(OnScrollListener.SCROLL_STATE_FLING);
} else {
int eventY = (int) event.getY();
int deltaMoveY = (int) Math.abs(eventY - mLastDownEventY);
long deltaTime = event.getEventTime() - mLastDownEventTime;
if (deltaMoveY <= mTouchSlop && deltaTime < ViewConfiguration.getTapTimeout()) {
if (mShowSoftInputOnTap) {
mShowSoftInputOnTap = false;
showSoftInput();
} else {
我的理论是showSoftInput方法是罪魁祸首。除了重写onTouch方法之外,我无法阻止showSoftInput。所以我创建了一个派生类来测试:
public class FPNumberPicker extends NumberPicker {
public FPNumberPicker(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public FPNumberPicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FPNumberPicker(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_UP: {
return false;
}
}
return super.onTouchEvent(event);
}
}
所以现在点击停止数字问题,但当然还有其他更糟糕的副作用。所以请不要将上述内容作为解决方案,这只是为了证实我的怀疑。