我有一个edittext和一个观察SPACE是否到达的textwatcher。如果它是一个空间我想立即删除它。或者,如果它是一个空间我想确保它不会出现但是以某种方式指示(seterror,toast)用户不允许空间。
edittext.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
//---//
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
我无法在afterTextChaned方法中定义onkeydown,因为它给了我一个错误。
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
if (keyCode == KeyEvent.KEYCODE_SPACE) {
}
}
所以它不起作用(语法错误,int keyCode
错误的构造。
提前谢谢你!
答案 0 :(得分:39)
解决方案通常更简单:
@Override
public void afterTextChanged(Editable s) {
String result = s.toString().replaceAll(" ", "");
if (!s.toString().equals(result)) {
ed.setText(result);
ed.setSelection(result.length());
// alert the user
}
}
这应该没有先前尝试的问题。
答案 1 :(得分:3)
setSelection
可以在EditText
的末尾再次设置光标:
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2,
int arg3) {}
@Override
public void beforeTextChanged(CharSequence s, int arg1, int arg2,
int arg3) {}
@Override
public void afterTextChanged(Editable arg0) {
if(editText.getText().toString().contains(" ")){ editText.setText(editText.getText().toString().replaceAll(" " , ""));
editText.setSelection(editText.getText().length());
Toast.makeText(getApplicationContext(), "No Spaces Allowed", Toast.LENGTH_LONG).show();
}
}});
答案 2 :(得分:2)
boolean editclicked =false ;
edittext.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
editclicked = false ;
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {
editclicked = true;
});
将此作为一个单独的功能:
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (editclicked) {
if (keyCode == KeyEvent.KEYCODE_SPACE) {
return false
}
} else {
super.onKeyDown(keyCode, event);
}
}
答案 3 :(得分:1)
@Override
public void afterTextChanged(Editable s) {
String result = s.toString().replaceAll("\\s", "");
if (!s.toString().equals(result)) {
int pos = editText.getSelectionStart() - (s.length() - result.length());
editText.setText(result);
editText.setSelection(Math.max(0,Math.min(pos, result.length())));
editText.setError("No spaces allowed");
}
}
\ s匹配任何空白字符(等于[\ r \ n \ t \ f \ v])
像这样设置选择,允许您在edittext中间输入或粘贴文本而不会丢失光标位置
答案 4 :(得分:0)
为了立即移除空间,您可以通过两种方式实现它。
一个简单的解决方案,您可以设置编辑文本的数字。
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
第二种方式可以设置过滤器
EditText.setFilters(new InputFilter[] { filter });
InputFilter filter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (Character.isSpaceChar(source.charAt(i))) {
return "";
}
}
return null;
}
}
答案 5 :(得分:0)
使用输入过滤器
实现此目的的另一种简单方法editText.setFilters(new InputFilter[]{new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source.toString().equalsIgnoreCase(" ")){
return "";
}
return source;
}
}});
这将立即删除用户输入的空格,并显示禁用空格的外观。
答案 6 :(得分:0)
我在spannables
中删除{strong> EditText
(样式)的即时空格删除的相对简单的解决方案:
开始时删除:
@Override
public void afterTextChanged(Editable s) {
int i;
for (i = 0; i < s.length() && Character.isWhitespace(s.charAt(i)); i++) { ; }
s.replace(0, i, "");
}
基本上就是这样,但你也可以这样做:
开始时删除(不中断第一次输入):
@Override
public void afterTextChanged(Editable s) {
String text = s.toString();
if(!text.trim().isEmpty()){
int i;
for (i = 0; i < s.length() && Character.isWhitespace(s.charAt(i)); i++) { ; }
s.replace(0, i, "");
}
}
在开始和结束时删除(在末尾允许1个空格以便于输入):
@Override
public void afterTextChanged(Editable s) {
int i;
//remove at start
for (i = 0; i < s.length() && Character.isWhitespace(s.charAt(i)); i++) { ; }
s.replace(0, i, "");
//remove at end, but allow one whitespace character
for (i = s.length(); i > 1 && Character.isWhitespace(s.charAt(i-1)) && Character.isWhitespace(s.charAt(i-2)); i--) { ; }
s.replace(i, s.length(), "");
}