Używanie widżetu NumberPicker z ciągami znaków


98

Czy istnieje sposób używania widżetu NumberPicker systemu Android do wybierania ciągów zamiast liczb całkowitych?

Odpowiedzi:


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

3
Kluczem dla mnie było to, że musisz ustawić wyświetlane wartości ORAZ min i max, zanim zadziała. Dzięki.
— Ben Clayton

To znacznie lepsze niż wybrana powyżej odpowiedź.
— Linh Lino

2
Ale kiedy klikam tekst, pojawia się miękka klawiatura i mogę edytować tekst.
— Zmieszaj

14
@ArulxZ Jeśli jeszcze tego nie zrobiłeś, po prostu wywołaj picker.setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); aby zapobiec wyskakiwaniu klawiatury.
— Karim Varela

To mi pomogło! Ale pojawia się wartość 0 i nie mogę jej usunąć. Masz jakiś pomysł? Aby wyjaśnić w moim selektorze pojawia się 0, Belgia, Francja, Wielka Brytania
— 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];
  }
});

mam nadzieję, że to pomoże!


To zdecydowanie najlepsza odpowiedź.
— samatron

jeśli jest tablicą, nie ma metod size () i get (). size () należy zamienić na .length, a get () na arrayString [wartość]
— RexSplode

Jeśli zamiast tego użyjesz programu formatującego setDisplayedValues, NumberPicker nie zmierzy poprawnie swojej szerokości, więc tekst może zostać obcięty, nawet jeśli pasuje prawidłowo.
— Matvey Rybakov

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

Możesz mieć na myśli coś innego, ale nie jest do końca jasne, co masz na myśli.

AKTUALIZACJA:

Możesz to sfałszować, ustawiając własny program formatujący:

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 () nadal będzie zwracać int, więc prawdopodobnie będziesz chciał zamapować nazwy krajów na ich identyfikatory.

DODANO: Implementacja NumberPicker ma:

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

Wydaje się, że lepiej radzi sobie z tym, co chcesz, niż powyższy program formatujący ... chociaż nie jest to wymienione w dokumentacji, więc prawdopodobnie nie jest częścią publicznego interfejsu API


Chciałbym nim wybrać np. Kraj. Podobnie jak Widget Spinner, ale bez otwierania dodatkowej ramki na dole, aby wybrać wartość.
— timoschloesser

Zaktualizowana odpowiedź, jednak prawdopodobnie istnieją lepsze sposoby na umieszczenie listy krajów niż próba włamania się do NumberPicker, aby zrobić tego rodzaju rzeczy.
— FunkTheMonk

@FunkTheMonk W ogóle nie mogłem znaleźć tej setRange()metody w dokumentacji! Jakieś pomysły, dlaczego?
— iTurki

Żadne udokumentowane metody nie są częścią publicznego interfejsu API - nie są oficjalnie obsługiwane przez Google i prawdopodobnie ulegną zmianie w przyszłości - używasz na własne ryzyko.
— FunkTheMonk

1
W moim przypadku to rozwiązanie miało mały błąd, po dotknięciu jednej z opcji zepsuło się lub zniknęło, nie wiem dobrze dlaczego. odpowiedź nan nie miała tego problemu. Każdy może mi powiedzieć, co się dzieje? W każdym razie myślę, że odpowiedź nan jest lepsza i powinna być akceptowaną odpowiedzią. Ale może czegoś mi brakuje?
— acrespo

8

wypróbuj to rozwiązanie, może ci pomóc

    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

To zadziałało dla mnie.

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","عربى"});
}
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.