Utilisation du widget NumberPicker avec des chaînes

95

Existe-t-il un moyen d'utiliser le widget Android NumberPicker pour choisir des chaînes au lieu d'entiers?

timoschloesser
la source

Réponses:

241
NumberPicker picker = new NumberPicker(this);
picker.setMinValue(0);
picker.setMaxValue(2);
picker.setDisplayedValues( new String[] { "Belgium", "France", "United Kingdom" } );
nan
la source
3
La clé pour moi, c'est que vous devez définir les valeurs affichées ET les valeurs min et max avant que cela fonctionne. Merci.
Ben Clayton
C'est bien mieux que la réponse choisie ci-dessus.
Linh Lino
2
Mais lorsque je clique sur le texte, le clavier virtuel apparaît et je peux modifier le texte.
Confuse le
14
@ArulxZ Si vous ne l'avez pas déjà compris, appelez simplement picker.setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); pour empêcher le clavier de sortir.
Karim Varela
Cela m'a aidé! Mais il apparaît la valeur 0 et je ne peux pas le supprimer .. Une idée? Pour expliquer dans mon sélecteur apparaît 0, Belgique, France, Royaume-Uni
user4292106
38
NumberPicker numberPicker = new NumberPicker(this);
String[] arrayString= new String[]{"hakuna","matata","timon","and","pumba"};
numberPicker.setMinValue(0);
numberPicker.setMaxValue(arrayString.length-1);

numberPicker.setFormatter(new NumberPicker.Formatter() {
  @Override
  public String format(int value) {
    // TODO Auto-generated method stub
    return arrayString[value];
  }
});

J'espère que cela pourra aider!

harshitpthk
la source
C'est de loin la meilleure réponse.
samatron le
s'il s'agit d'un tableau, il n'a pas les méthodes size () et get (). size () doit être remplacé par .length, et get () remplacé par arrayString [valeur]
RexSplode
Si vous utilisez le formateur au lieu de setDisplayedValues, le NumberPicker ne mesurera pas sa largeur correctement, votre texte peut donc être tronqué même s'il peut s'adapter correctement.
Matvey Rybakov
15
String value = String.valueOf(picker.getValue());

Vous pourriez vouloir dire autre chose, mais ce que vous voulez dire n'est pas très clair.

ACTUALISÉ:

Vous pouvez le simuler en définissant votre propre formateur:

CountryFormatter implements Formatter {
    public String toString(int value) {
        switch(value) {
            case 0:
                return "England";
            case 1:
                return "France";
        }
        return "Unknown";
    }
}

picker.setFormatter(new CountryFormatter());

getValue () renverra toujours un int, donc vous voudrez probablement mapper les noms des pays à leurs identifiants.

AJOUTÉ: L'implémentation de NumberPicker a:

public void setRange(int start, int end, String[] displayedValues)

Ce qui semble faire un meilleur travail de ce que vous voulez que le formateur ci-dessus .. bien qu'il ne soit pas mentionné dans la documentation, donc ne fait probablement pas partie de l'API publique

FunkTheMonk
la source
Je voudrais l'utiliser pour choisir par exemple un pays. Tout comme le Spinner Widget, mais sans ouvrir un cadre supplémentaire en bas pour choisir une valeur.
timoschloesser
Réponse mise à jour, mais il existe probablement de meilleures façons de répertorier les pays que d'essayer de pirater NumberPicker pour faire ce genre de chose.
FunkTheMonk
@FunkTheMonk Je n'ai pas du tout trouvé cette setRange()méthode dans la documentation! Des idées pourquoi?
iTurki
Aucune méthode documentée ne fait partie de l'API publique - elles ne sont pas officiellement prises en charge par Google et elles changeront probablement à l'avenir - vous les utilisez à vos propres risques.
FunkTheMonk
1
Dans mon cas, cette solution avait un petit bug, en touchant l'une des options, elle a pépin ou a disparu, je ne sais pas très bien pourquoi. La réponse de nan n'avait pas ce problème. N'importe qui peut me dire ce qui pourrait se passer? Quoi qu'il en soit, je pense que la réponse de nan est meilleure et devrait être la réponse acceptée. Mais peut-être que je manque quelque chose?
acrespo
8

essayez cette solution, peut vous aider

    NumberPicker pickers = new NumberPicker(this);
    String[] arrayPicker= new String[]{"abc","def","ghi","jkl","mno"};

    //set min value zero
    pickers.setMinValue(0);
    //set max value from length array string reduced 1
    pickers.setMaxValue(arrayPicker.length - 1);
    //implement array string to number picker
    pickers.setDisplayedValues(arrayPicker);
    //disable soft keyboard
    pickers.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
    //set wrap true or false, try it you will know the difference
    pickers.setWrapSelectorWheel(false);

    //create button to test selected text string
    btnPicker.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //get position (int) from number picker
            int pos = pickers.getValue();
            //get string from number picker and position
            String selecPicker = arrayPicker[pos];  
            //test toast to get selected text string
            Toast.makeText(context, selecPicker , Toast.LENGTH_SHORT).show();

        }
    });
Irvan Dwi Pangga
la source
0

Cela a fonctionné pour moi.

public class YourClassName extends AppCompatActivity {

NumberPicker picker = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout_file);

    picker = (NumberPicker) findViewById(R.id.pickerId_From_your_Layout_file);

     picker.setMinValue(0);
    picker.setMaxValue(3);
    picker.setDisplayedValues(new String[]{"English", "French","Kiswahili","عربى"});
}
}
NelsonRoberts
la source