kotlin 设置DigitKeyListener时,十进制分隔键不可见
我希望允许用户根据区域使用十进制分隔符(逗号或点)输入数字 现在,我使用
kotlin 设置DigitKeyListener时,十进制分隔键不可见,
kotlin,android,kotlin,android-edittext,
kotlin,Android,Kotlin,Android Edittext,我希望允许用户根据区域使用十进制分隔符(逗号或点)输入数字 现在,我使用digitskeylister启用逗号作为某些地区(例如波兰、德国)的分隔符 val separator=DecimalFormatSymbols.getInstance().decimalSeparator editTextValue.keyListener=DigitsKeyListener.getInstance(“-0123456789$separator”) 这段代码是用英文写的 若软件键盘是Gboard或其他第
digitskeylister
启用逗号作为某些地区(例如波兰、德国)的分隔符
val separator=DecimalFormatSymbols.getInstance().decimalSeparator
editTextValue.keyListener=DigitsKeyListener.getInstance(“-0123456789$separator”)
这段代码是用英文写的
若软件键盘是Gboard
或其他第三方键盘,则一切正常,用户可以使用逗号或点作为分隔符
但当用户使用普通键盘并设置了DigitsKeyListener
时,并非所有键都可见,并且用户无法添加分隔符
这是我的编辑文本代码:
val separator=DecimalFormatSymbols.getInstance().decimalSeparator
//editTextValue.keyListener=DigitsKeyListener.getInstance(“-0123456789$separator”)
注释带有DigitsKeyListener
的行时,分隔符的键可见,但唯一可用的分隔符是dot
你知道如何在股票键盘上用逗号作为分隔符吗?我曾经遇到过同样的问题。三星设备上的普通键盘太可怕了。。。没有办法用逗号显示数字键盘
我找到的最佳解决方案就是通过TextWatcher
但仅当默认区域设置的小数分隔符是逗号时
允许在数字中同时使用点(.)和逗号(,),并在XML中将inputType设置为numberDecimal
:
<EditText
android:id="@+id/editText_price"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:digits="1234567890,."
android:imeOptions="actionDone"
android:inputType="numberDecimal" />
然后,要获得字符串的实际数目,请使用以下命令:
try {
val price = DecimalFormat.getInstance().parse(editTextPrice.text.toString());
} catch (e: ParseException) {
e.printStackTrace()
editText_price.setError(getString(R.string.error))
}
问题是当使用带有接受字符字符串的getInstance时。由于KeyListener会覆盖EditText的输入类型,因此设置KeyListener后,EditText现在具有inputType number,而不是numberDecimal或numberSigned
由于DigitsKeyListener非常有用,一个简单的修复方法是简单地委托给它,但使用正确的输入类型。在科特林,这非常简单:
class DecimalSignedDigitsKeyListener(digitsKeyListener: DigitsKeyListener) :
KeyListener by digitsKeyListener {
override fun getInputType() =
InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL or
InputType.TYPE_NUMBER_FLAG_SIGNED
}
val separator = DecimalFormatSymbols.getInstance().decimalSeparator
val digitsKeyListener = DigitsKeyListener.getInstance("<your digits>")
editTextValue.keyListener = DecimalSignedDigitsKeyListener(digitsKeyListener)
class DecimalSignedDigitsKeyListener(digitsKeyListener:digitsKeyListener):
digitsKeyListener的KeyListener{
重写getInputType()=
输入TYPE.TYPE\u类别\u编号或
InputType.TYPE\u数字\u标志\u十进制或
InputType.TYPE\u编号\u标志\u签名
}
val separator=DecimalFormatSymbols.getInstance().decimalSeparator
val digitsKeyListener=digitsKeyListener.getInstance(“”)
editTextValue.keyListener=DecimalSignedDigitsKeyListener(digitsKeyListener)
我建议除了任何特定于语言环境的分隔符外,始终接受“.”,因为并非所有键盘都会显示逗号或其他符号。public class main活动扩展了活动{
private EditText editText;
private String blockCharacterSet = "~#^|$%&*!";
private InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source != null && blockCharacterSet.contains(("" + source))) {
return "";
}
return null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
editText.setFilters(new InputFilter[] { filter });
}
}
private EditText editText;
private String blockCharacterSet = "~#^|$%&*!";
private InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source != null && blockCharacterSet.contains(("" + source))) {
return "";
}
return null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
editText.setFilters(new InputFilter[] { filter });
}