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.