Почему OnSeekBarChangeListener всегда возвращает логическую переменную false?

У меня есть один вертикальный Seekbar в моем проекте Android. Вертикальная панель поиска инициализируется в методе onCreate:

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          

}                                               
};

changeByUser всегда возвращает false. Сменил ли я 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);
}
}

1 ответ

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

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 на панель поиска (вертикальная панель поиска)

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

Внутри onTouchMethod сделайте эту переменную true

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

    }

};

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

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

Другие вопросы по тегам