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

98

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

Timoschloesser
источник

Ответы:

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

FunkTheMonk
источник
Я хотел бы использовать его, чтобы выбрать, например, страну. Точно так же, как и виджет 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","عربى"});
}
}
Нельсон Робертс
источник