【问题标题】:Number picker with custom values shows wrong data when tapping on it具有自定义值的数字选择器在点击时显示错误数据
【发布时间】:2014-11-30 04:42:21
【问题描述】:

我只有在 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。所有其他数字工作正常。

谁能帮我解决这个问题?我真的不知道为什么会发生这种情况,也无法谷歌任何答案。

【问题讨论】:

标签: android focus picker numberpicker


【解决方案1】:

我看到了同样的问题。我正在实现一个自定义时间选择器,其分钟值以 5 分钟为增量(据我所知,这不能用股票时间选择器完成。)

对于左侧选择器,我将显示值初始化为: “12”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“11”

如果我将值设置为 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);
    }       
}

所以现在点击停止了数字问题,但当然还有其他更糟糕的副作用。所以请不要将以上作为解决方案,这只是为了证实我的怀疑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2011-08-29
    相关资源
    最近更新 更多