gpt4 book ai didi

android - KeyListener 究竟做了什么?

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:49 26 4
gpt4 key购买 nike

如果我是对的,存在一个错误,即当语言环境显示小数点是逗号(如在德国或意大利)时,Android 的数字键盘不接受输入逗号。它仍然只接受点。我必须在我的应用程序中修复此错误。要求是:

  1. 当焦点设置到 EditText 时,程序会以符号/数字模式调出软键盘。
  2. 在欧洲语言环境下,键盘接受逗号(和符号)。
  3. 并且,#2 必须以编程方式完成。

我发现我可以使用 XML 来实现#1 和#2(尽管它允许输入中有多个符号和小数点),但它不满足#3:

android:inputType="numberDecimal|numberSigned"
android:digits="1234567890,-"

文档说 android:digits 可以通过使用 KeyListener 来实现。所以我做了一个 KeyListener 来允许/禁止字符。但据我所见,无论我从 onKeyDown() 返回什么,输入字符总是被允许的。我希望 KeyListener() 允许我过滤输入,但我一定错过了一些东西。你能指出来吗?谢谢!

et.setKeyListener(new KeyListener() {
@Override public void clearMetaKeyState(View view, Editable content, int states) {}
@Override public int getInputType() { return InputType.TYPE_CLASS_NUMBER; }
@Override public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) {
if ((keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) ||
keyCode == KeyEvent.KEYCODE_MINUS ||
keyCode == KeyEvent.KEYCODE_COMMA) {
// I want to allow these
return false;
}
// I want to disallow the rest
return true;
}
@Override public boolean onKeyOther(View view, Editable text, KeyEvent event) { return false; }
@Override public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) { return false; }
});

P.S: 我也试过使用 et.setFilters() 并给它一个自定义的 InputFilter。但似乎只要 android:inputType="numberDecimal" 存在,我需要将键盘设置为数字/符号模式,它就会忽略我的过滤器。

final int decimalPoint = ',';
InputFilter[] filterArray = new InputFilter[1];
filterArray[0] = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
{
int dots = 0, i;
String s = source.toString();
String d = dest.toString();
boolean hasSign = false;

if (source.length() == 0)
return null;

for (i = 0; i < d.length(); i++)
if (d.charAt(i) == '-')
hasSign = true;
else if (d.charAt(i) == decimalPoint)
dots++;
for (i = start; i < end && i < s.length(); i++) {
if ((s.charAt(i) >= '0' && s.charAt(i) <= '9') ||
(s.charAt(i) == '-' && !hasSign && i == start && d.length() == 0))
continue;
if (s.charAt(i) == decimalPoint && dots == 0) {
dots++;
continue;
}
s = s.substring(0, start) + s.substring(start + 1, end);
end--;
}
return s.length() == source.length() ? null : s;
}};
et.setFilters(filterArray);

最佳答案

这应该可以解决问题。

et.setKeyListener(DigitsKeyListener.getInstance("1234567890,-"));

关于android - KeyListener 究竟做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7295119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com