2014-10-05 20 views
2

我只有在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。所有其他數字都可以。

任何人都可以幫助我嗎?我真的不知道爲什麼發生這種情況,不能谷歌任何答案。

mypicker

+0

我有完全相同的問題。你可以在這裏看到我的解決方案:http://stackoverflow.com/questions/31882051/numberpicker-showing-wrong-value-after-setvalue?answertab=active#tab-top – 2017-04-27 16:20:21

回答

1

我看到了同樣的問題。我正在實施一個具有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); 
    }  
} 

所以現在汲水站的數量問題,但當然還有其他更壞的副作用。所以請不要把上述當作解決方案,這只是爲了證實我的懷疑。

相關問題