对于EditText
框,用户应该只输入有效数字,因此我使用android:inputType="numberDecimal"
。不幸的是,Android提出的软键盘只有顶行的数字,而接下来的三行有各种其他符号(美元符号,百分号,感叹号,空格等)。由于numberDecimal
只接受数字0-9,负号和小数点,因此使用“手机”软键盘(3x3网格中的0-9,加上其他一些符号)会更有意义。这将使按钮更大并且更容易被击中(因为它是4x4网格而不是同一屏幕区域中的10x4网格)。不幸的是,使用android:inputType="phone"
允许使用非数字字符,例如括号
我试图使用android:inputType="numberDecimal|phone"
,但是bit标志的numberDecimal
方面似乎被忽略了。我也尝试将android:inputType="phone"
与android:digits="0123456789-."
结合使用,但仍允许多个负号或小数点(inputType="number"
对此类事情进行了非常好的错误检查,并且不会让用户甚至键入它)。我也尝试在xml布局文件中使用android:inputType="phone"
,同时在java代码中使用DigitsKeyListener
,但之后只使用默认数字软键盘(仅在顶行有数字的键盘) (它似乎设置InputType.TYPE_CLASS_NUMBER
,这会使xml布局设置的InputType.TYPE_CLASS_PHONE
无效。
编写自定义IME不起作用,因为用户必须选择IME作为应用程序之外的全局选项。
有没有办法使用“手机”式软键盘,同时对所输入的内容使用“数字”限制?
答案 0 :(得分:20)
我遇到了同样的问题。这对我有用:
<item name="android:inputType">numberDecimal</item>
<item name="android:digits">0123456789.</item>
希望这可以帮到你。
答案 1 :(得分:8)
到目前为止,我决定扩展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;
}
}
这样做有什么不妥(将getInputType()的返回切换为超类不想要的东西)?
答案 2 :(得分:1)
您只需使用手机键盘并自行检查输入。测试输入是否为0到9之间的有效数字并不是一个很大的条件。
答案 3 :(得分:1)
Adam Dunn代码完美无缺,但没有展示如何实现类
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));
答案 4 :(得分:1)
android:inputType="phone"
android:digits="0123456789."
将此添加到您的 EditText
xml 布局。
这将显示电话布局,但只允许用户点击指定的数字。
用户点击其他字符将被忽略。
答案 5 :(得分:0)
尝试在EditText视图中使用android:numeric="integer"
。