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?

Antworten:


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

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!


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


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

        }
    });

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","عربى"});
}
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.