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