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?

timoschloesser
źródło

Odpowiedzi:

245
NumberPicker picker = new NumberPicker(this);
picker.setMinValue(0);
picker.setMaxValue(2);
picker.setDisplayedValues( new String[] { "Belgium", "France", "United Kingdom" } );
nan
źródło
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!

harshitpthk
źródło
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

FunkTheMonk
źródło
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();

        }
    });
Irvan Dwi Pangga
źródło
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","عربى"});
}
}
NelsonRoberts
źródło