如何在"手机"软键盘上使用InputType = numberDecimal?

Ada*_*unn 20 android numeric-keypad

对于一个EditText盒子,用户应该只输入有效数字,所以我正在使用android:inputType="numberDecimal".不幸的是,Android提出的软键盘只有顶行的数字,而接下来的三行有各种其他符号(美元符号,百分号,感叹号,空格等).由于numberDecimal只接受数字0-9,负号和小数点,因此使用"手机"软键盘(3x3网格中的0-9,加上其他一些符号)会更有意义.这将使按钮更大并且更容易被击中(因为它是4x4网格而不是同一屏幕区域中的10x4网格).不幸的是,使用android:inputType="phone"允许非数字字符,如括号

我试图使用android:inputType="numberDecimal|phone",但numberDecimal位标志的方面似乎被忽略了.我也试过android:inputType="phone"结合使用android:digits="0123456789-.",但仍然允许多个负号或小数点(inputType="number"对于这样的事情有非常好的错误检查,并且不会让用户输入它).我也尝试android:inputType="phone"在xml布局文件中使用,同时DigitsKeyListener在java代码中使用a ,但是那只是使用默认数字软键盘(只有顶行有数字的键盘)(它似乎设置InputType.TYPE_CLASS_NUMBER,这使得InputType.TYPE_CLASS_PHONE集合无效通过xml布局).

编写自定义IME不起作用,因为用户必须选择IME作为应用程序外的全局选项.

有没有办法使用"手机"式软键盘同时使用"数字"限制输入什么?

小智 23

我有同样的问题.这对我有用:

<item name="android:inputType">numberDecimal</item>
<item name="android:digits">0123456789.</item>
Run Code Online (Sandbox Code Playgroud)

希望这会对你有所帮助.


Ada*_*unn 9

到目前为止,我决定扩展DigitsKeyListener并覆盖getInputType(),以便它返回InputType.TYPE_CLASS_PHONE.这允许我在DigitsKeyListener中使用方便的filter(),但同时使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做有什么不妥(将getInputType()的返回切换到超类不想要的东西)?