Використання віджета NumberPicker із рядками


95

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

Відповіді:


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

3
Для мене ключовим було те, що перед тим, як це запрацює, вам потрібно встановити відображувані значення І мінімальне і максимальне значення. Дякую.
Бен Клейтон,

Це набагато краще, ніж обрана відповідь вище.
Linh Lino

2
Але коли я натискаю на текст, вискакує м'яка клавіатура, і я можу редагувати текст.
Плутати

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 [значення]
RexSplode

Якщо ви використовуєте форматор замість 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 цього питання не було. Будь-хто може сказати мені, що може відбуватися? У будь-якому випадку, я думаю, що відповідь нана краща, і вона повинна бути прийнятою. Але, можливо, мені чогось не вистачає?
відповідь

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.