2017-02-08 5 views
4

Ich habe eine vertikale Seekbar in meinem Android-Projekt. Vertikal SeekBar wird in onCreate Methode initialisiert:Warum gibt OnSeekBarChangeListener immer die boolesche Variable false zurück?

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

Und ich habe OnSeekBarChangeListener Schnittstelle zu implementieren, wie unten

gezeigt
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 ist immer false zurück. Ob ich Seekbar wechselte oder nicht. Bitte helfen Sie mir, dieses Problem zu lösen. Vielen Dank im Voraus.

My Custom Vertical SeekBar Klasse Code ist

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

Antwort

2

ich keine Antwort bekam haben, warum es Wert false zurück. Aber ich habe die alternative Lösung, um zu wissen, ob der Wetterbenutzer den Suchleistenwert geändert hat oder ob die Suchbalkenwertcodierung geändert wurde. Ich änderte den Wert der Suchleiste abhängig vom Wert des Drehfelds. So nehmen variable

boolean changedBySpinner=false; 

Innen Spinner ItemClickListener machen es wahr

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

Satz touchClickListener auf der seekbar (vertikale seekbar)

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

Innen onTouchMethod diese Variable machen wahr

changedBySpinner=false; 

Und innerhalb seekbarChangeListener unten Code hinzufügen

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 

    } 

}; 

Ihre Aktion ausführen, die im Inneren, wenn Block wollte. Wie setze ich Spinner-Wert auf 0. Element.

Nun, das ist nur eine alternative Lösung. Wenn Sie das gleiche Problem haben, können Sie es verwenden.