2010-06-13 20 views
67

¿Alguien sabe cómo definir el valor mínimo de SeekBar? ¿Esto se hace en el diseño XML o necesito definirlo programáticamente?Android SeekBar Valor mínimo

Básicamente necesito cambiar mi valor mínima desde 0 a 0,2

Respuesta

102

Hola, ¿alguien sabe cómo definir un valor mínimo de SeekBar?

No se puede definir el valor mínimo. Es 0.

Básicamente tengo que cambiar mi valor mínimo a partir 0 a 0,2

Cuando se obtiene el valor, añadir 0.2 a ella.

+0

Debe llamar a 'setProgress' también para que el cambio se refleje en la interfaz de usuario, como lo demuestra Szabolcs Becze en su respuesta. –

+4

@ user1617737: No, no deberías. Su respuesta no tiene nada que ver con el valor mínimo. El 'SeekBar' representa el rango de 0 a (max-min). Para obtener el valor ajustado, agrega el mínimo deseado al progreso real. Como el progreso real ya está "reflejado en la IU", no hay nada que cambiar allí. – CommonsWare

+0

Bien, eso depende de cómo estén configuradas sus etiquetas. Acabo de proporcionar una respuesta completa, que creo que es la única forma correcta de hacerlo. http://stackoverflow.com/questions/3033135/android-seekbar-minimum-value/25239248#25239248 –

8

Básicamente he agregado el tamaño + 10 que establecerá automáticamente el mínimo en 10, puede cambiar el suyo para configurarlo, que mín. valor.

@Override 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    int siz = size + 10; 
    txtViewFontSize.setTextSize(siz); 

    Toast.makeText(this, String.valueOf(siz), Toast.LENGTH_SHORT).show(); 

} 
+0

Básicamente he agregado el tamaño + 10 que establecerá automáticamente el mínimo en 10, puede cambiar el suyo para configurarlo, que mín. valor. – SALMAN

+10

No utilice comentarios para explicar el código en su respuesta, inclúyalo como parte de la respuesta. – Flexo

+0

No hay setMin. Me gustaría establecer el mínimo en -2 ... – powder366

3

Mi solución que funciona bien para mí es:

@Override 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    if (progress <= SOME_LIMIT) { 
     seekBar.setProgress(SOME_LIMIT); 
    } else { 
     // DO SOMETHING 
    } 

} 
12

Esto es lo que utilizo para obtener android:max para un rango máximo/min para una SeekBar.

mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
    int progressChanged = minimumValue; 

    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     progressChanged = minimumValue+ progress; 
    } 
}); 

Así obtendrá la gama minimum to minimum+max;

Para establecer el valor máximo en xml, use max=(desiredMax-min);

+1

Sí, creo que este es el mejor enfoque. Las unidades de SeekBar son solo valores abstractos. Simplemente puede ajustarlos en el código para obtener las unidades reales que desea, por lo que he votado por encima de su respuesta. –

5

El valor mínimo debe ser 0 para el objeto SeekBar en Java (es decir, no se puede cambiar), pero esta es la forma de obtener el aspecto y el rendimiento necesarios.

Supongamos que usted quiere que su min a ser 5 y el máximo para ser 100 ...

Por lo tanto, usted tiene una gama de 95, por lo que habría que configurar SeekBar con un valor máximo de 95.

Si su barra de búsqueda tiene etiquetas de interfaz de usuario, las haría 5 (mín) y 100 (máx).

Por lo tanto, el diseño de XML sería algo así como ...

<LinearLayout 
    android:id="@+id/sampleSizeLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/batchDurationSecsLayout" 
    android:orientation="vertical" 
    android:visibility="visible" > 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/sample_size" /> 

    <SeekBar 
     android:id="@+id/sampleSizeSeekBar" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:max="95" /> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:visibility="visible" > 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:gravity="left" 
      android:text="5" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentTop="true" 
      android:gravity="right" 
      android:text="100" /> 

    </RelativeLayout> 

</LinearLayout> 

Así ahora se puede introducir la corrección 5, así ...

final SeekBar sampleSizeSeekBar = (SeekBar)findViewById(R.id.sampleSizeSeekBar); 
final int sampleSizeSeekBarCorrection = 5; //e.g., 95 <--> 100 
int realValueFromPersistentStorage = appObj.getSampleSize(); //Get initial value from persistent storage, e.g., 100 
sampleSizeSeekBar.setProgress(realValueFromPersistentStorage - sampleSizeSeekBarCorrection); //E.g., to convert real value of 100 to SeekBar value of 95. 
sampleSizeSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

    int val = sampleSizeSeekBar.getProgress(); 

    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     val = progress + sampleSizeSeekBarCorrection; //e.g., to convert SeekBar value of 95 to real value of 100 
    } 

    public void onStartTrackingTouch(SeekBar seekBar) { 
    } 

    public void onStopTrackingTouch(SeekBar seekBar) { 
     try { 
      appObj.saveSampleSize(val); //Save real value to persistent storage, e.g., 100 
      appObj.makeToast("Sample size set to " + val); 
     } 
     catch(Exception e) { 
      Log.e(LOG_TAG, "Error saving sample size", e); 
      appObj.makeToast("Error saving sample size: " + e); 
     } 
    } 
}); 

Esta solución dará su barra de búsqueda el mínimo, máximo y escala correctos en la IU, y la posición del control no 'saltará' hacia la derecha si el usuario la desliza completamente hacia la izquierda.

+0

Buena explicación .. –

2

No puede establecer el progreso en float porque seekbar.getProgress() siempre devuelve el valor entero. El siguiente código configurará el valor de la vista de texto en 0.2 si el valor de la barra de búsqueda es 0. puede cambiar el valor de MinimumVal de acuerdo con sus requerimientos.

int minimumVal = 0; 

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 


       if (progress >= minimumVal) { 
        seekBar.setProgress(progress); 
        textView.setText(progress); 
       } else { 
        seekBar.setProgress(minimumVal); 
        textView.setText("0.2"); 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 
1

Usted puede intentar hacer de esta manera:

int yourMinProgress = 10;

private SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = 
    new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean b) { 

      if (progress < yourMinProgress) { 
       seekBar.setProgress(10); 
      } 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    }; 
0

este código funciona para mí bien !!!

SeekBar seekBar = (SeekBar)findViewById(R.id.seekBar); 
seekBar.setMax(100); 
seekBar.setProgress(40); 
seekBar.setOnSeekBarChangeListener(seekBarChangeListener); 

SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { 
    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean b) { 
     if(progress <= 40){ 
      seekBar.setProgress(40); 
     } 
     if(progress >= 40) { 
      pgr_status.setText(String.valueOf(progress)); 
     } 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 

    } 
}; 
1

En versiones api> = 26 ahora puede agregar min atributo xml para SeekBar:

android:min="0.2"

0

Finalmente encontré una manera de establecer seekBarvalor mínimo, juego acaba de establecer su setOnSeekBarChangeListener de la siguiente manera:

int minimumValue = 10; // your minimum value 
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     // you can set progress value on TextView as usual 
     txtProgress.setText(String.valueOf(progress)); 

    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     if(seekBar.getProgress() < minimumValue) 
      seekBar.setProgress(minimumValue); 

    } 
}); 

Espero que esto ayude :)

0

Como dicen Juan Magalhaes:

ahora puede agregar atributo min xml para SeekBar con:

android:min="0.2" 

Pero es mejor para la API < 26 al utilizar el atributo compat;):

xmlns:app="http://schemas.android.com/apk/res-auto" 
app:min="0.2" 
+0

no existe tal atributo "aplicación: min". Compile dice que no ^^ – GuilhE

0

Aquí es cómo lo hice esto con Kotlin:

view.controlTextSize.setOnClickListener { 

     textSizeControl.textSizeControlSlider.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{ 

      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { 
       var progress = progress 
       if (progress < 10){ 
        progress = 10 
        seekBar?.progress = progress 
       } 

       view.content.textSize = progress.toFloat() 
       prefs.edit().putFloat("ContentTextSize", progress.toFloat()).apply() 
      } 

      override fun onStartTrackingTouch(seekBar: SeekBar?) {} 

      override fun onStopTrackingTouch(seekBar: SeekBar?) {} 
     }) 
     textSizeControl.show() 
    }