我看到了同樣的問題。我正在實施一個具有5分鐘增量的分鐘值的自定義時間選擇器(根據我的情況,這是無法用庫存時間選擇器完成的)。
對於左側選取器,我將顯示值初始化爲: 「12」 1「,2」,3「,」4「,」5「,」6「,」7「,」8「,」9「,」10「,」11「
如果I將該值設置爲1(「1」)並點擊它,它將在「12」和「1」之間切換。我分析了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);
}
}
所以現在汲水站的數量問題,但當然還有其他更壞的副作用。所以請不要把上述當作解決方案,這只是爲了證實我的懷疑。
我有完全相同的問題。你可以在這裏看到我的解決方案:http://stackoverflow.com/questions/31882051/numberpicker-showing-wrong-value-after-setvalue?answertab=active#tab-top – 2017-04-27 16:20:21