2017-02-08 1 views
4

J'ai un Vertical Seekbar dans mon projet Android. Vertical Seekbar est initialisé dans onCreate Méthode:Pourquoi OnSeekBarChangeListener renvoie toujours la variable booléenne false?

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

Et je dois mettre en œuvre l'interface OnSeekBarChangeListener comme indiqué ci-dessous

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 est toujours faux retour. Si j'ai changé Seekbar ou pas. S'il vous plaît aidez-moi à sortir de ce problème. Merci d'avance.

My Custom verticale Seekbar Code classe est

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); 
} 
} 

Répondre

2

Je ne l'ai pas eu la réponse que la raison pour laquelle il est de retour valeur fausse. Mais j'ai eu la solution alternative de connaître l'utilisateur de temps changé la valeur de seekbar ou vous avez changé le codage de valeur de seekbar. Je changeais la valeur de seekbar en fonction de la valeur de spinner. Alors, prenez la variable

boolean changedBySpinner=false; 

intérieur Spinner ItemClickListener rendre vrai

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

ensemble touchClickListener sur la barre de recherche (SeekBar vertical)

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

intérieur onTouchMethod faire cette variable vrai

changedBySpinner=false; 

Et à l'intérieur seekbarChangeListener ajouter ci-dessous le code

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 

    } 

}; 

Perform votre action qui a voulu, à l'intérieur si le bloc. Comme je suis en train de définir la valeur de spinner à 0ème élément.

Eh bien, ceci est juste une solution alternative. Si vous faites face au même problème, vous pouvez l'utiliser.