Как использовать InputType=numberDecimal с программной клавиатурой "телефон"?

Для 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 в качестве глобального параметра вне приложения.

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

6 ответов

Решение

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

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

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

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

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

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:inputType="phone"
android:digits="0123456789."

Добавьте это в свой EditTextxml макет.
Это отобразит макет телефона, но позволит пользователю нажимать только указанные цифры.
Пользователь, нажимающий на другие символы, будет проигнорирован.

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

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

Другие вопросы по тегам