¿Cómo definir el valor mínimo de un SeekBar? ¿Esto se hace en el diseño XML o necesito definirlo programáticamente?
Básicamente necesito cambiar mi valor mínimo de 0 a 0,2
Respuestas:
¿Cómo definir el valor mínimo de un SeekBar?
No puede definir el valor mínimo. Lo es 0
.
Básicamente necesito cambiar mi valor mínimo de 0 a 0,2
Cuando obtenga el valor, agréguelo 0.2
.
SeekBar
representa el rango de 0 a (máximo-mínimo). Para obtener el valor ajustado, agregue el mínimo deseado al progreso real. Dado que el progreso real ya está "reflejado en la interfaz de usuario", no hay nada que cambiar allí.
Esto es lo que utilizo para obtener android:max
un rango máximo / mínimo para a SeekBar
.
mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
int progressChanged = minimumValue;
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
progressChanged = minimumValue+ progress;
}
});
Entonces obtendrás el rango minimum to minimum+max
;
Para establecer el valor máximo en xml, use max=(desiredMax-min)
;
El valor mínimo debe ser 0 para el objeto SeekBar en Java (es decir, no se puede cambiar), pero así es como se obtiene el aspecto y el rendimiento necesarios.
Suponga que quiere que su mínimo sea 5 y su máximo sea 100 ...
Por lo tanto, tiene un rango de 95, por lo que necesitaría 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.).
Entonces, el XML de diseño 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í que ahora puedes introducir la 5
corrección, 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 le dará a su barra de búsqueda el mínimo, el máximo y la escala correctos en la interfaz de usuario, y la posición del control no 'saltará' hacia la derecha si el usuario lo desliza completamente hacia la izquierda.
Básicamente, agregué el tamaño + 10, que establecerá automáticamente el mínimo en 10, puede cambiar el suyo para establecer qué min. 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();
}
En las versiones de api> = 26 ahora puede agregar el min
atributo xml a SeekBar:
android:min="0.2"
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
}
}
No puede establecer el progreso en flotante porque seekbar.getProgress () siempre devuelve un valor entero. El siguiente código establecerá el valor de vista de texto en 0.2 si el valor de la barra de búsqueda es 0. Puede cambiar el valor mínimo de acuerdo con sus requisitos.
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) {
}
});
Creé esta biblioteca simple, no es mucho, pero puede ahorrarle algo de tiempo.
Puedes intentar hacerlo 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) {
}
};
este código me funciona 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) {
}
};
Finalmente encontré una manera de establecer seekBar
el valor mínimo , solo configúrelo setOnSeekBarChangeListener
así:
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 :)
Así es como 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()
}
setProgress
para que el cambio se refleje en la interfaz de usuario, como lo demuestra Szabolcs Becze en su respuesta.