Valor mínimo de Android SeekBar

81

¿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

Sachin
fuente

Respuestas:

122

¿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.

CommonsWare
fuente
También debe llamar setProgresspara que el cambio se refleje en la interfaz de usuario, como lo demuestra Szabolcs Becze en su respuesta.
ban-geoengineering
4
@ user1617737: No, no deberías. Su respuesta no tiene nada que ver con el valor mínimo. El SeekBarrepresenta 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í.
CommonsWare
Bueno, eso depende de cómo estén configuradas las etiquetas. Acabo de proporcionar una respuesta completa que creo que es la única forma correcta de hacerlo. stackoverflow.com/questions/3033135/…
ban-geoengineering
Configure la etiqueta MIN con el valor mínimo y configure la etiqueta MAX con el valor máximo. En onProgressChanged (), establezca su etiqueta de valor actual como progreso + minValue.
Rahul Rastogi
22

Esto es lo que utilizo para obtener android:maxun 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);

Asma
fuente
2
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, así que voté a favor de su respuesta.
David George
9

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 5correcció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.

ban-geoingeniería
fuente
9

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

}
SALMAN
fuente
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.
SALMAN
10
No utilice comentarios para explicar el código en su respuesta, inclúyalo como parte de la respuesta.
Flexo
6

En las versiones de api> = 26 ahora puede agregar el minatributo xml a SeekBar:

android:min="0.2"

João Magalhães
fuente
5

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
    }

} 
Szabolcs Becze
fuente
4

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) {

            }
        });
Dharmesh
fuente
1

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) {

        }
    };
Sasha
fuente
0

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) {

    }
};
Karthick
fuente
0

Finalmente encontré una manera de establecer seekBar el valor mínimo , solo configúrelo setOnSeekBarChangeListenerasí:

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 :)

Behzad Bahmanyar
fuente
0

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()
    }
Riajul
fuente
0

Si lo está utilizando com.android.support:preference-v7, SeekBarPreferenceya tiene un método setMin(int).

Solo llámalo en onCreatePreferences()tu PreferenceFragmentCompat.

Los valores XML todavía se ignorarán en API <26, pero configurarlo programáticamente, funciona.

arnab321
fuente