Как использовать InputType = numberDecimal с помощью «телефонной» мягкой клавиатуры?

Для поля EditText пользователь должен вводить только допустимые числа, поэтому я использую android:inputType="numberDecimal" . К сожалению, мягкая клавиатура, которую Android поднимает, имеет номера только вдоль верхней строки, в то время как в следующих трех строках есть различные другие символы (знак доллара, знак процента, восклицательный знак, пробел и т. Д.). Поскольку число numberDecimal принимает только числа 0-9, отрицательный знак и десятичную точку, было бы numberDecimal использовать «телефонную» мягкую клавиатуру (0-9 в сетке 3×3, а также некоторые другие символы). Это сделало бы кнопки более крупными и более легкими для удара (поскольку это сетка 4×4, а не сетка 10×4 в той же области экрана). К сожалению, использование android:inputType="phone" позволяет использовать нечисловые символы, такие как круглые скобки

Я попытался использовать android:inputType="numberDecimal|phone" , но numberDecimal аспекта битового флага, кажется, игнорируется. Я также пробовал использовать android:inputType="phone" в сочетании с android:digits="0123456789-." , Но который все еще допускает множественные отрицательные знаки или десятичные точки ( inputType="number" имеет действительно хорошую проверку ошибок для подобных вещей и не позволит пользователю даже ввести его). Я также пробовал использовать android:inputType="phone" в файле макета xml, используя DigitsKeyListener в java-коде, но затем он просто использует стандартную клавиатуру с номерами по умолчанию (ту, которая имеет номера только по верхней строке) (это Кажется, установлен InputType.TYPE_CLASS_NUMBER , который InputType.TYPE_CLASS_PHONE установленный в макете xml).

Написание пользовательского IME не будет работать, так как пользователю нужно будет выбрать IME как глобальную опцию вне приложения.

Есть ли способ использовать мягкую клавиатуру стиля «телефон», а также использовать ограничения «числа» на том, что введено?

    У меня такая же проблема. Это работает для меня:

     <item name="android:inputType">numberDecimal</item> <item name="android:digits">0123456789.</item> 

    Надеюсь, это поможет вам.

    Пока что я решил сделать расширение DigitsKeyListener и переопределить getInputType (), чтобы он возвращал InputType.TYPE_CLASS_PHONE. Это позволяет мне использовать удобный фильтр () в DigitsKeyListener, но в то же время используйте мягкую клавиатуру TYPE_CLASS_PHONE. Я новичок в программировании на Android, но, похоже, это работает, не нарушая ничего. Код выглядит примерно так:

     import android.text.method.DigitsKeyListener; import android.text.InputType; public class CustomDigitsKeyListener extends DigitsKeyListener { public CustomDigitsKeyListener() { super(false, false); } public CustomDigitsKeyListener(boolean sign, boolean decimal) { super(sign, decimal); } public int getInputType() { return InputType.TYPE_CLASS_PHONE; } } 

    Есть ли что-то не так в этом (переключая возврат getInputType () на то, что суперкласс не намеревался)?

    Код Adam Dunn работает отлично, но не показал, как реализовать класс

     import android.text.method.DigitsKeyListener; import android.text.InputType; public class CustomDigitsKeyListener extends DigitsKeyListener { public CustomDigitsKeyListener() { super(false, false); } public CustomDigitsKeyListener(boolean sign, boolean decimal) { super(sign, decimal); } public int getInputType() { return InputType.TYPE_CLASS_PHONE; } } 

    То вам нужно сделать такой пример

     MyTextView.setKeyListener(new CustomDigitsKeyListener(true,true)); 

    Попробуйте использовать android:numeric="integer" в вашем представлении EditText.

    Вы просто используете клавиатуру телефона и сами проверяете ввод. Не очень важно проверить, соответствует ли входная цифра между 0 и 9.