【发布时间】:2016-10-07 19:00:58
【问题描述】:
在我的 EditText 中,我需要限制除字母、数字和 单个 空格之外的所有字符。我尝试添加到 XML:
android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
我仍然可以输入多个空格。如何更改此设置并允许用户输入不超过 1 个空格?
【问题讨论】:
-
您可以在提交后验证用户输入,如果有多个空格则返回错误消息
在我的 EditText 中,我需要限制除字母、数字和 单个 空格之外的所有字符。我尝试添加到 XML:
android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
我仍然可以输入多个空格。如何更改此设置并允许用户输入不超过 1 个空格?
【问题讨论】:
您必须以编程方式检查它。但请保留您拥有的 XML 内容。那还是不错的。只需检查空格数。试试这个:
String str = myEditText.toString();
int first = str.indexOf(" ");
boolean noneOrOneSpace = (first != -1) ? str.indexOf(" ", first + 1) : true;
然后你需要应用它来在editText的textChangedListener中使用它。发生更改时删除,您会注意到第二个空格,然后删除 EditText 中的最后一个字符
【讨论】:
在这种情况下,数字将不起作用。
您可以尝试使用 TextWatcher,然后将用户输入的所有多个空格替换为单个空格。
例如:
yourEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
yourEditText.removeTextChangeListener(this);
// Uses append() method on edit-text instead of setText()
// in an order to prevent soft keyboard reset.
String tempStr = s.toString().substring(0, s.length());
yourEditText.getText().clear();
// This line replaces all the multiple spaces with single space.
tempStr = tempStr.replaceAll("\\s+", " ");
yourEditText.append(tempStr);
yourEditText.setSelection(tempStr.length());
yourEditText.addTextChangedListener(this);
}
@Override
public void afterTextChanged(Editable s) {}
});
【讨论】:
我想我有一个干净的解决方案:
inputText.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
int whiteSpaceCount = 0;
for (int i = 0; i < s.toString().length(); i++) {
if (Character.isWhitespace(s.charAt(i))) {
whiteSpaceCount++;
}
if (whiteSpaceCount > 1 && !Character.isLetter(s.charAt(i))) {
s.replace(i, i + 1, "");
}else if (!Character.isLetter(s.charAt(i)) && !Character.isWhitespace(s.charAt(i))) {
s.replace(i, i + 1, "");
}
}
}
});
希望对你有帮助,别忘了在最后显示之前把 inputText 剪掉,这样如果用户在开头或结尾输入了空格,我们就可以剪掉它。
【讨论】:
这里的代码 sn-p 工作得很好。在文本更改后调用它不会进入无限循环,同时在 TextWatcher 中设置文本
public void handleSpaceValidation(EditText editText, Editable editable) {
String s = editText.getText().toString();
int count = 0;
loop:
for (int i = 0; i < editable.length(); i++) {
if (editable.charAt(i) == ' ') {
count++;
if (count > 1) {
String after = s.trim().replaceAll(" +", " ");
editText.setText(after);
editText.setSelection(after.length());
break loop;
}
}
}
}
【讨论】:
Digits 没有那种能力。您必须为您的 EditText 创建一个自定义过滤器。
【讨论】:
我已经解决了我的问题,我必须在打字时只允许一个空格。
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.e("BeforeText", String.valueOf(s));
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.e("OnText", String.valueOf(s));
//
}
@Override
public void afterTextChanged(Editable s) {
Log.e("AfterText", String.valueOf(s));
if(editText.getText().toString().length()>1)
{
if(editText.getText().toString()
.charAt(editText.getText().toString().length()-1)
==editText.getText().toString()
.charAt(editText.getText().toString().length()-2))
{
String value=editText.getText().toString().substring(0,
editText.getText().toString().length()-1);
editText.setText(value);
editText.setSelection(value.length());
}
}
}
});
【讨论】: