Verwenden des NumberPicker-Widgets mit Zeichenfolgen

94

Gibt es eine Möglichkeit, das Android NumberPicker-Widget zum Auswählen von Zeichenfolgen anstelle von Ganzzahlen zu verwenden?

timoschloesser
quelle

Antworten:

239
NumberPicker picker = new NumberPicker(this);
picker.setMinValue(0);
picker.setMaxValue(2);
picker.setDisplayedValues( new String[] { "Belgium", "France", "United Kingdom" } );
nan
quelle
3
Der Schlüssel für mich war, dass Sie die angezeigten Werte UND die Min- und Max-Werte einstellen müssen, bevor es funktioniert. Vielen Dank.
Ben Clayton
Dies ist viel besser als die oben gewählte Antwort.
Linh Lino
2
Aber wenn ich auf den Text klicke, erscheint die Softtastatur und ich kann den Text bearbeiten.
Verwirren Sie den
14
@ArulxZ Wenn Sie dies noch nicht herausgefunden haben, rufen Sie einfach picker.setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS) auf. um zu verhindern, dass die Tastatur auftaucht.
Karim Varela
Das hat mir geholfen! Aber es erscheint der Wert 0 und ich kann ihn nicht entfernen. Irgendeine Idee? Um in meiner
Auswahl
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];
  }
});

hoffentlich hilft das!

harditpthk
quelle
Dies ist bei weitem die beste Antwort.
Samatron
Wenn es sich um ein Array handelt, verfügt es nicht über die Methoden size () und get (). size () sollte durch .length ersetzt werden und get () sollte durch arrayString [value]
RexSplode am
Wenn Sie stattdessen den Formatierer verwenden setDisplayedValues, misst der NumberPicker seine Breite nicht richtig, sodass Ihr Text möglicherweise abgeschnitten wird, selbst wenn er richtig passt.
Matvey Rybakov
15
String value = String.valueOf(picker.getValue());

Sie könnten etwas anderes bedeuten, aber es ist nicht sehr klar, was Sie meinen.

AKTUALISIERT:

Sie können es fälschen, indem Sie Ihren eigenen Formatierer einstellen:

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 () gibt weiterhin ein int zurück, daher möchten Sie wahrscheinlich die Namen von Ländern ihren IDs zuordnen.

ADDED: Die Implementierung von NumberPicker hat:

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

Das scheint besser zu funktionieren als der obige Formatierer. Obwohl es in der Dokumentation nicht erwähnt wird, ist es wahrscheinlich nicht Teil der öffentlichen API

FunkTheMonk
quelle
Ich möchte damit beispielsweise ein Land auswählen. Genau wie das Spinner-Widget, jedoch ohne einen zusätzlichen Rahmen unten zu öffnen, um einen Wert auszuwählen.
Timoschloesser
Aktualisierte Antwort, es gibt jedoch wahrscheinlich bessere Möglichkeiten, Länder aufzulisten, als zu versuchen, NumberPicker zu hacken, um so etwas zu tun.
FunkTheMonk
@FunkTheMonk Ich konnte diese setRange()Methode überhaupt nicht in den Dokumenten finden! Irgendwelche Ideen warum?
iTurki
Keine dokumentierten Methoden sind nicht Teil der öffentlichen API - sie werden von Google nicht offiziell unterstützt und werden sich wahrscheinlich in Zukunft ändern - Sie verwenden sie auf eigenes Risiko.
FunkTheMonk
1
In meinem Fall hatte diese Lösung einen kleinen Fehler. Beim Berühren einer der Optionen ist sie fehlerhaft oder verschwunden. Ich weiß nicht genau, warum. Nans Antwort hatte dieses Problem nicht. Kann mir jemand sagen, was passieren könnte? Wie auch immer, ich denke, Nans Antwort ist besser und sollte die akzeptierte Antwort sein. Aber vielleicht fehlt mir etwas?
Acrespo
8

Versuchen Sie diese Lösung, kann Ihnen helfen

    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
quelle
0

Das hat bei mir funktioniert.

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
quelle