2017-02-08 11 views
4

У меня есть один вертикальный искатель в моем проекте андроида. Вертикальная SeekBar инициализируется в методе OnCreate:Почему OnSeekBarChangeListener всегда возвращает логическую переменную false?

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

И я должен реализовать OnSeekBarChangeListener интерфейс, как показано ниже

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 всегда возвращают ложь. Я изменил 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

я не получил ответ, что, почему это значение возвращения ложным. Но я получил альтернативное решение для того, чтобы узнать, что пользователь изменил значение поискового пользователя, или у вас изменилось кодирование значения значка. Я меняю значение знака поиска, используя значение счетчика. Так возьмите переменной

boolean changedBySpinner=false; 

Внутри Spinner ItemClickListener сделать это истинный

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

множество touchClickListener на SeekBar (вертикальная SeekBar)

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 

    } 

}; 

Выполните свои действия, которые хотели, внутри, если блок. Как я устанавливаю значение spinner для 0-го элемента.

Ну, это просто альтернативное решение. Если вы столкнулись с той же проблемой, вы можете ее использовать.