Использование виджета 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.