Utilizzo del widget NumberPicker con le stringhe


94

C'è un modo per utilizzare il widget NumberPicker di Android per scegliere stringhe invece di numeri interi?

Risposte:


239
NumberPicker picker = new NumberPicker(this);
picker.setMinValue(0);
picker.setMaxValue(2);
picker.setDisplayedValues( new String[] { "Belgium", "France", "United Kingdom" } );

3
La chiave per me era che devi impostare i valori visualizzati E il minimo e il massimo prima che funzioni. Grazie.
Ben Clayton

Questo è molto meglio della risposta scelta sopra.
Linh Lino

2
Ma quando faccio clic sul testo, viene visualizzata la tastiera morbida e posso modificare il testo.
Confondere l'

14
@ArulxZ Se non l'hai già capito, chiama picker.setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); per evitare che la tastiera salti fuori.
Karim Varela

Questo mi ha aiutato! Ma sembra il valore 0 e non posso rimuoverlo .. Qualche idea? Per spiegare nel mio selettore appare 0, Belgio, Francia, Regno Unito
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];
  }
});

spero che aiuti!


Questa è di gran lunga la migliore risposta.
samatron

se è un array, non ha i metodi size () e get (). size () dovrebbe essere sostituito con .length e get () sostituito con arrayString [value]
RexSplode

Se usi il formattatore invece di setDisplayedValues, NumberPicker non misurerà la sua larghezza correttamente, quindi il tuo testo potrebbe essere tagliato anche se può adattarsi correttamente.
Matvey Rybakov,

15
String value = String.valueOf(picker.getValue());

Potresti significare qualcos'altro, ma non è molto chiaro cosa intendi.

AGGIORNATO:

Puoi falsificarlo impostando il tuo formattatore:

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 () restituirà comunque un int, quindi probabilmente vorrai mappare i nomi dei paesi ai loro ID.

AGGIUNTO: L'implementazione di NumberPicker ha:

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

Che sembra fare un lavoro migliore di quello che vuoi allora il formattatore sopra .. anche se non è menzionato nella documentazione quindi probabilmente non fa parte dell'API pubblica


Vorrei usarlo per scegliere ad esempio un paese. Proprio come fa il widget Spinner, ma senza aprire un frame aggiuntivo in basso per scegliere un valore.
timoschloesser

Risposta aggiornata, tuttavia ci sono probabilmente modi migliori per elencare i paesi piuttosto che provare a hackerare NumberPicker per fare questo genere di cose.
FunkTheMonk

@FunkTheMonk Non sono riuscito a trovare questo setRange()metodo nei documenti! Qualche idea sul perché?
iTurki

Nessuno dei metodi documentati non fa parte dell'API pubblica - non sono ufficialmente supportati da Google e probabilmente cambieranno in futuro - lo usi a tuo rischio e pericolo.
FunkTheMonk

1
Nel mio caso, questa soluzione aveva un piccolo bug, quando si toccava una delle opzioni, si è interrotta o è scomparsa, non so molto bene perché. la risposta di nan non ha avuto questo problema. Qualcuno può dirmi cosa potrebbe succedere? Comunque, penso che la risposta di nan sia migliore e dovrebbe essere la risposta accettata. Ma forse mi manca qualcosa?
acrespo

8

prova questa soluzione, potrebbe aiutarti

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

        }
    });

0

Questo ha funzionato per me.

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","عربى"});
}
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.