Використання віджета 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.