2013-09-13 2 views
5

Есть ли способ предложить или ограничить ввод с клавиатуры при выборе NumberPicker, поэтому при вводе значений отображаются только числовые элементы, аналогичные тому, как вы можете использовать android:inputType="number" с EditText?Ограничение Android NumberPicker на числовую клавиатуру для ввода цифр (не Alpha)

У меня есть ряд значений от 0.0 до 100.0 с шагом 0,1, что я хотел бы использовать NumberPicker для выбора в Android 4.3. Для того, чтобы иметь Выбирается числа, я создал массив строк, который соответствует этим значениям, как показано ниже:

NumberPicker np = (NumberPicker) rootView.findViewById(R.id.programmingNumberPicker);   
    int numberOfIntensityOptions = 1001; 

    BigDecimal[] intensityDecimals = new BigDecimal[numberOfIntensityOptions]; 
    for(int i = 0; i < intensityDecimals.length; i++) 
    { 
     // Gets exact representations of 0.1, 0.2, 0.3 ... 99.9, 100.0 
     intensityDecimals[i] = BigDecimal.valueOf(i).divide(BigDecimal.TEN); 
    } 

    intensityStrings = new String[numberOfIntensityOptions]; 
    for(int i = 0; i < intensityDecimals.length; i ++) 
    { 
     intensityStrings[i] = intensityDecimals[i].toString(); 
    } 

    // this will allow a user to select numbers, and bring up a full keyboard. Alphabetic keys are 
    // ignored - Can I somehow change the keyboard for this control to suggest to use *only* a number keyboard 
    // to make it much more intuitive? 
    np.setMinValue(0); 
    np.setMaxValue(intensityStrings.length-1); 
    np.setDisplayedValues(intensityStrings); 
    np.setWrapSelectorWheel(false); 

Как больше информации, я заметил, что если я не использую метод setDisplayedValues() и вместо этого задайте целые числа непосредственно, будет использоваться числовая клавиатура , которая будет, но проблема заключается в том, что введенное число в 10 раз больше, чем должно быть - например если вы введете «15» в управление его интерпретировать как «1.5»

 // This will allow a user to select using a number keyboard, but input needs to be 10x more than it should be. 
     np.setMinValue(0); 
     np.setMaxValue(numberOfIntensityOptions-1); 
     np.setFormatter(new NumberPicker.Formatter() { 
      @Override 
      public String format(int value) { 
       return BigDecimal.valueOf(value).divide(BigDecimal.TEN).toString(); 
      } 
     }); 

Любые предложения о том, как поднять цифровую клавиатуру, чтобы позволить пользователю вводить десятичные числа, как это?

+0

Отличный вопрос, вы когда-нибудь это понимали? Я хотел бы знать, как это сделать! –

+0

@AlanMoore К сожалению, нет, я не понял, как это сделать. – CrimsonX

+0

Пробовали ли вы искать текстовое представление для детей, а затем, используя свое изменение выше, чтобы получить свою клавиатуру? –

ответ

7

Я успешно достиг этого, заимствуя тяжело от @LuksProg's helpful answer к другому вопросу. Основная идея состоит в том, чтобы искать компонент EditText в NumberPicker, а затем назначать тип ввода как числовой. Сначала добавьте этот метод (спасибо снова @LuksProg):

private EditText findInput(ViewGroup np) { 
    int count = np.getChildCount(); 
    for (int i = 0; i < count; i++) { 
     final View child = np.getChildAt(i); 
     if (child instanceof ViewGroup) { 
      findInput((ViewGroup) child); 
     } else if (child instanceof EditText) { 
      return (EditText) child; 
     } 
    } 
    return null; 
} 

Тогда в моем методе Activity в OnCreate() Я называю это и установить тип входа:

np.setMinValue(0); 
np.setMaxValue(intensityStrings.length-1); 
EditText input = findInput(np);  
input.setInputType(InputType.TYPE_CLASS_NUMBER); 

Это сделал трюк для меня !

+1

Работает на Android 6, если ваш setDisplayedValues ​​() - числовые строки, но сбой, если они содержат другие символы (например, единицы измерения, например «1 метр», «2 метра»). – personne3000

1

Мой ответ, чтобы улучшить на основе Алана Мура, просто измените последнюю строку

input.setInputType(InputType.TYPE_CLASS_NUMBER); 

в

input.setRawInputType(InputType.TYPE_CLASS_NUMBER); 

тогда будет больше не проблема, как сказал personne3000, не больше аварий. Прошу прощения, мой английский не очень хорошо, но я надеюсь, что вы поймете, что я имею в виду.