2014-10-05 10 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 –

답변

1

나는 같은 문제를보고하고있다. 내가 알 수있는 한 재고 시간 선택기로 할 수없는 5 분 단위로 분 값으로 사용자 지정 시간 선택 도구를 구현하고 있습니다.

왼쪽 선택 도구로 표시 값을 "12"로 초기화합니다. 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); 
    }  
} 

그래서 지금은 도청이 숫자 문제를 중지,하지만 다른 나쁜 부작용은 물론있다. 그러니 제발 솔루션으로 위의 걸릴하지 마십시오, 그것은 단순히 내 의혹을 확인하는 것입니다.