Использование виджета NumberPicker со строками


98

Есть ли способ использовать виджет Android NumberPicker для выбора строк вместо целых чисел?

Ответы:


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

3
Ключевым моментом для меня было то, что вы должны установить отображаемые значения И минимальное и максимальное значение, прежде чем оно сработает. Спасибо.
Бен Клейтон

Это намного лучше, чем выбранный выше ответ.
Linh Lino

2
Но когда я нажимаю на текст, появляется мягкая клавиатура, и я могу редактировать текст.
Confuse

14
@ArulxZ Если вы еще этого не поняли, просто вызовите picker.setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); чтобы клавиатура не выскакивала.
Карим Варела

Это мне помогло! Но появляется значение 0, и я не могу его удалить .. Есть идеи? Для объяснения в моем сборщике появляется 0, Бельгия, Франция, Великобритания
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];
  }
});

надеюсь, это поможет!


Это, безусловно, лучший ответ.
samatron

если это массив, то у него нет методов size () и get (). size () следует заменить на .length, а get () - на arrayString [value]
RexSplode 03

Если вы используете форматтер вместо setDisplayedValues, NumberPicker не будет правильно измерять его ширину, поэтому ваш текст может быть обрезан, даже если он может поместиться должным образом.
Матвей Рыбаков

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

Вы могли иметь в виду что-то другое, но не совсем понятно, что вы имеете в виду.

ОБНОВЛЕНО:

Вы можете подделать его, установив собственный форматер:

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 () по-прежнему будет возвращать int, поэтому вы, вероятно, захотите сопоставить названия стран с их идентификаторами.

ДОБАВЛЕНО: В реализации NumberPicker есть:

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

Который, кажется, лучше справляется с тем, что вы хотите, чем вышеуказанный форматировщик .. хотя он не упоминается в документации, поэтому, вероятно, не является частью общедоступного API


Я хотел бы использовать его, чтобы выбрать, например, страну. Точно так же, как и виджет Spinner, но без открытия дополнительной рамки внизу для выбора значения.
timoschloesser

Обновленный ответ, однако, вероятно, есть лучшие способы перечислить страны, чем пытаться взломать NumberPicker для подобных вещей.
FunkTheMonk

@FunkTheMonk Мне вообще не удалось найти этот setRange()метод в документации! Есть идеи, почему?
iTurki

Никакие документированные методы не являются частью общедоступного API - они официально не поддерживаются Google и, вероятно, будут изменены в будущем - вы используете на свой страх и риск.
FunkTheMonk

1
В моем случае у этого решения была небольшая ошибка, при касании одного из вариантов он давал сбой или исчезал, я не очень хорошо знаю, почему. Ответ nan не имел этой проблемы. Кто-нибудь может сказать мне, что может происходить? В любом случае, я думаю, что ответ Нана лучше и должен быть принятым ответом. Но, может быть, я что-то упускаю?
acrespo 06

8

попробуйте это решение, может вам помочь

    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

Это сработало для меня.

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","عربى"});
}
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.