2017-02-08 3 views
4

내 안드로이드 프로젝트에 Vertical Seekbar가 하나 있습니다.왜 OnSeekBarChangeListener가 항상 부울 변수 false를 반환합니까?

verticalSeekBar1 = (VerticalSeekBar) findViewById(R.id.verticalSeekbar1); 
verticalSeekBar1.setOnSeekBarChangeListener(Listener1); 

그리고 나는 항상 false를 반환한다

private SeekBar.OnSeekBarChangeListener Listener1 = new SeekBar.OnSeekBarChangeListener() { 

@Override                      
public void onProgressChanged(SeekBar arg0, int seekBarLevel, boolean changedByUser) {   

    verticalSeekBar1.setProgress(seekBarLevel);             

    Log.e(TAG, "onProgressChanged: UserChnagedSeekbar :: "+changedByUser);                   

    if (changedBySpinner){                  
     mSpinner.setSelection(0);             
    }                 
} 

@Override          
public void onStartTrackingTouch(SeekBar arg0) { 
    // TODO Auto-generated method stub   

}            

@Override          
public void onStopTrackingTouch(SeekBar arg0) { 
    // TODO Auto-generated method stub   

}            
}; 

changedByUser 아래와 같이 OnSeekBarChangeListener 인터페이스를 구현해야 : 수직 SeekBar를가에서 onCreate 방법에 초기화됩니다. Seekbar를 변경했는지 여부. 이 문제에서 벗어나도록 도와주세요. 미리 감사드립니다.

내 사용자 정의 수직 SeekBar를 클래스 코드는 내가 대답을 가지고하지 않았다

public class VerticalSeekBar extends SeekBar { 

private Context mContext; 

public VerticalSeekBar(Context context) { 
    super(context); 
    init(context); 
} 

public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(context); 
} 

public VerticalSeekBar(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 

private void init(Context context){ 
    mContext=context; 
} 

protected void onSizeChanged(int w, int h, int oldWidth, int oldHeight) { 
    super.onSizeChanged(h, w, oldh, oldw); 
} 

@Override 
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(heightMeasureSpec, widthMeasureSpec); 
    setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); 
} 

protected void onDraw(Canvas c) { 

    Paint paint=new Paint(); 
    paint.setColor(Color.DKGRAY); 
    paint.setStrokeWidth(2.0f); 
    Rect rect=new Rect(0,0,getMeasuredWidth(),getMeasuredHeight()); 
    //c.drawRect(rect,paint); 

    int vWidth=getMeasuredWidth(); 
    int vHeight=getMeasuredHeight(); 

    float startPointY=83; 
    float middlePointY = (vHeight)/2; 
    float lastPointY=vHeight-83; 

    paint.setColor(Color.DKGRAY); 
    c.drawLine(rect.left,startPointY,rect.centerX(),startPointY,paint); 
    c.drawLine(rect.left,middlePointY,rect.centerX(),middlePointY,paint); 
    c.drawLine(rect.left,lastPointY,rect.centerX(),lastPointY,paint); 

    paint.setColor(Color.DKGRAY); 

    float x=((vHeight/2)-startPointY)/3; 
    float f10dbPoint=x+startPointY; 
    float f5dbPoint=(2*x)+startPointY; 
    float fm5dbPoint=(vHeight/2)+x; 
    float fm10dbPoint=(vHeight/2)+(2*x); 

    float startX=rect.left+32; 
    c.drawLine(startX,f10dbPoint,rect.centerX(),f10dbPoint,paint); 
    c.drawLine(startX,f5dbPoint,rect.centerX(),f5dbPoint,paint); 
    c.drawLine(startX,fm5dbPoint,rect.centerX(),fm5dbPoint,paint); 
    c.drawLine(startX,fm10dbPoint,rect.centerX(),fm10dbPoint,paint); 

    c.rotate(-90); 
    c.translate(-getHeight(),0); 

    super.onDraw(c); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (!isEnabled()) { 
     return false; 
    } 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     case MotionEvent.ACTION_MOVE: 
     case MotionEvent.ACTION_UP: 
      int i=0; 
      i=getMax() - (int) (getMax() * event.getY()/getHeight()); 
      setProgress(i); 
      Log.i("Progress",getProgress()+""); 
      onSizeChanged(getWidth(), getHeight(), 0, 0); 
      break; 

     case MotionEvent.ACTION_CANCEL: 
      break; 
    } 
    return true; 
} 

public void updateThumb(){ 
    onSizeChanged(getWidth(), getHeight(), 0, 0); 
} 
} 

답변

2

있다가 값을 반환 왜 거짓 그. 하지만 날씨 사용자가 seekbar 값을 변경했는지 또는 seekbar 값 코딩을 변경했는지 알 수있는 대체 솔루션이 있습니다. 스피너 값에 따라 seekbar 값을 변경했습니다. 그래서 변수

boolean changedBySpinner=false; 

내부 스피너 ItemClickListener가 SeekBar를에 그 사실

mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      changedBySpinner=true; 
    } 
}); 

설정 touchClickListener (수직 검색 막대를) 만들 걸릴

verticalSeekBar1.setOnTouchListener((View.OnTouchListener) this); 

내부 onTouchMethod 사실 그 변수를 만들

changedBySpinner=false; 

그리고 seekbarChangeListener 내부

private SeekBar.OnSeekBarChangeListener Listener1 = new SeekBar.OnSeekBarChangeListener() { 

    @Override 
    public void onProgressChanged(SeekBar arg0, int seekBarLevel, boolean changedByUser) { 

     if (!changedBySpinner){ 
      mSpinner.setSelection(0); 
     } 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar arg0) { 
     // TODO Auto-generated method stub 

    } 

}; 

는, 내부 블록 경우에 원 액션을 수행 코드 아래에 추가합니다. 마찬가지로 나는 스피너 값을 0 번째 요소로 설정하고있다.

글쎄, 이것은 단지 대안 일뿐입니다. 같은 문제에 직면하면 사용할 수 있습니다.

관련 문제