这是我的编辑文字
<EditText
android:id="@+id/etWaardeVan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:digits="0123456789."
android:inputType="number|numberDecimal"
android:scrollHorizontally="true"
android:singleLine="true"
/>
如何以编程方式仅允许输入一个点。
这是你想要的?
Set EditText Digits Programmatically
etWarDevan.setKeyListener(DigitsKeyListener.getInstance("0123456789."));
我删除了最后输入的字符,如果它是一个点,之前有一个。
EditText field = view.findViewById(R.id.etWaardeVan);
field.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable editable) {
String str = editable.toString();
String strold = str.substring(0, str.length() - 2);
String lastchar = str.substring(str.length() - 1);
if(strold.contains(".") && lastchar.equals(".")) field.setText(str);
}
});
提示:这仅在用户不跳回并在字符串中间输入点时才有效。您可能想要禁用光标移动。 (像this或使用android:cursorVisible
)
或者(如果输入始终包含一个点),您可以创建两个不带点的EditTexts。
这是我的解决方案,它有效:
dot.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//only show one dot if user put more than one dot
if(input.contains(".")){
//then save what it has
input = textView.getText().toString();
}else {
//concat the input value
input=input+".";
}
}
});
基本上,EditText派生自TextView,它有一个
void addTextChangedListener(TextWatcher watcher)
方法。 TextWatcher有回调,比如
abstract void afterTextChanged(Editable s)
您可以实现以便过滤新文本仅包含句点。
正则表达式:(?<=^| )\d+(\.\d+)?(?=$| )
例
et1.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
// Do something here with regex pattern
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});