61 votes

Modification des valeurs des étapes dans la barre de recherche ?

J'ai une barre de recherche, en la déplaçant je veux changer les valeurs de 0 à 200. J'ai un TextView, où j'affiche ces valeurs tout en déplaçant la barre de recherche. Mais je ne veux pas avoir toutes les valeurs de cet intervalle (0,1,2,3,4,5...), mais plutôt 10, 20, 30...etc. Ainsi, lorsque je déplace la barre de recherche, je veux afficher 10, 20, 30, 40.... à 200. Quelqu'un peut-il me donner un conseil ou un exemple pour faire cela ?

0 votes

122voto

Dharmendra Points 14394

Essayez le code ci-dessous

SeekBar seekBar = (SeekBar)layout.findViewById(R.id.seekbar);
seekBar.setProgress(0);
seekBar.incrementProgressBy(10);
seekBar.setMax(200);
TextView seekBarValue = (TextView)layout.findViewById(R.id.seekbarvalue);
seekBarValue.setText(tvRadius.getText().toString().trim());

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        progress = progress / 10;
        progress = progress * 10;
        seekBarValue.setText(String.valueOf(progress));
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

setProgress(int) est utilisé pour définir la valeur de départ de la barre de recherche.

setMax(int) est utilisé pour définir la valeur maximale de la barre de recherche

Si vous voulez définir les limites de la barre de recherche, vous pouvez vérifier la valeur de la barre de progression dans le champ onProgressChanged méthode. Si la progression est inférieure ou supérieure à la limite, vous pouvez la fixer à la limite que vous avez définie.

0 votes

Wow, c'est juste un excellent exemple ! Quoi qu'il en soit, puis-je fixer la valeur minimale de la barre de recherche à 10 ? Je peux définir la valeur maximale en disant 'seekBar.setMax(200)', mais il n'y a pas de valeur minimale. J'ai quelques idées sur la façon de le faire, mais j'obtiens des erreurs à chaque fois(

0 votes

Utilisez seekBar.setProgress(10) ; pour fixer la valeur minimale à 10 dans la barre de recherche.

0 votes

J'ai résolu ce problème. Vous voyez, lorsque j'ai simplement fixé une progression à 10, j'étais toujours capable de fixer 0, et je voulais empêcher cette option (afin que l'utilisateur ne puisse pas choisir une valeur inférieure à 10). J'ai fait cela en mettant une déclaration 'if' dans le ChangeListener.

26voto

Gabriele Mariotti Points 7243

Vous pouvez utiliser le Slider fourni par le Bibliothèque des composants matériels en utilisant le android:stepSize attribut :

    <com.google.android.material.slider.Slider
        android:valueFrom="0"
        android:valueTo="200"
        android:stepSize="10"
       ..>

enter image description here

19voto

Shahar Points 575

Le moyen le plus simple auquel je pense est de définir simplement :

SeekBar yourSeekBar = (SeekBar)findViewById(R.id.yourSeekBarId);
yourSeekbar.setMax(20);

Ensuite, il faut surcharger ces méthodes (les méthodes vides sont également requises, même si elles sont vides) :

yourSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {          
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (fromUser) {
                if (progress >= 0 && progress <= sizeSeekBar.getMax()) {                        

                    String progressString = String.valueOf(progress * 10);
                    yourTextView.setText(progressString); // the TextView Reference
                    seekBar.setSecondaryProgress(progress);
                }
            }

        }
    });

L'idée est de ne définir que 20 valeurs pour la barre de recherche, mais de toujours multiplier la valeur par 10 et d'afficher cette valeur. Si vous n'avez pas vraiment besoin de 200 valeurs, il est inutile d'utiliser 200 valeurs.

3 votes

+1 pour la simplicité. J'ai cherché un autre problème et j'ai fini ici, mais je pense que vous méritez le +1.

1 votes

Cela semble être la meilleure solution, c'est certain. J'aime la façon dont il passe directement au numéro suivant. Progresser alors que le nombre est statique semble bizarre.

3voto

userSeven7s Points 14480

Vous devez utiliser le SeekBar.OnSeekBarChangeListener pour suivre l'évolution de la situation. Appelez mseek.setMax(200) . Effectuez une opération modulo sur la valeur actuelle pour décider si l'affichage du texte doit être mis à jour ou non.

SeekBar.OnSeekBarChangeListener() {

    void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (progress % 10 == 0) {
            textview.setText(""+progress);
        }
    }
}

2 votes

Cela risque de sauter des valeurs si la barre n'est pas très large et/ou si votre doigt bouge rapidement.

0 votes

Accepter. C'est la première chose qui m'est venue à l'esprit. et ce n'est pas la bonne réponse.

0 votes

C'est un bel exemple, mais @Kris Van Bael a raison, - il saute des valeurs.

3voto

Ebin Joy Points 477

Vous pouvez également réaliser ceci en définissant la classe SeekBar personnalisée comme ci-dessous

public class CustomSeekBar extends AppCompatSeekBar {

int SEEKBAR_MULTIPLIER = 1;

public CustomSeekBar(Context context) {
    super(context);
}

public CustomSeekBar(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

public void setSeekBarConfig( int SEEKBAR_MULTIPLIER, int SEEKBAR_MAX){
    setMax(SEEKBAR_MAX);
    this.SEEKBAR_MULTIPLIER = SEEKBAR_MULTIPLIER;
}

@Override
public int getProgress() {
    return super.getProgress() * SEEKBAR_MULTIPLIER;
}
}

Et peut être utilisé de la manière suivante

 CustomSeekBar mCustomSeekBar = (CustomSeekBar) findViewById(R.id.customSeekBar);
 mSeekBar.setSeekBarConfig(10,20);

Dans le fichier xml, vous devez ajouter CustomSeekBar au lieu de SeekBar.

<*.CustomSeekBar
    com.quemb.qmbform.view:setSeekBarConfig="10"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/seekBar" />

Ainsi, vous pouvez réutiliser la barre de recherche personnalisée dans toute l'application sans avoir à répéter tout un calcul supplémentaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X