Как использовать InputType = numberDecimal с программной клавиатурой «телефон»? - PullRequest
20 голосов
/ 14 мая 2010

Для поля EditText пользователь должен вводить только действительные числа, поэтому я использую android:inputType="numberDecimal". К сожалению, экранная клавиатура, которую вызывает Android, имеет цифры только вдоль верхнего ряда, в то время как в следующих трех строках есть другие символы (знак доллара, знак процента, восклицательный знак, пробел и т. Д.). Поскольку numberDecimal принимает только цифры 0-9, знак минус и десятичную точку, было бы более целесообразно использовать программную клавиатуру "телефон" (0-9 в сетке 3x3 плюс некоторые другие символы). Это сделало бы кнопки больше и легче нажимать (поскольку это сетка 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 в качестве глобального параметра вне приложения.

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

Ответы [ 5 ]

21 голосов
/ 29 ноября 2011

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

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

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

9 голосов
/ 15 мая 2010

До сих пор я решил расширить 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 () на то, что суперкласс не намеревался)?

2 голосов
/ 27 февраля 2014

Код Адама Данна отлично работает, но не показывает, как реализовать класс

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));
1 голос
/ 14 мая 2010

Вы просто используете клавиатуру телефона и проверяете ввод самостоятельно.Это не очень большое условие, чтобы проверить, является ли ввод действительной цифрой от 0 до 9.

0 голосов
/ 24 июня 2010

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

...