Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Пока что я решил сделать расширение 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;
    }
}

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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));

Ответ 5

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