如果用户按下空格,如何从edittext立即删除空格?

我有一个edittext,还有一个看着SPACE是否到达的textwatcher。 如果它是一个空格,我想立即删除它。 或者,如果它的空间我想确保它不出现,但以某种方式表示(seterror,吐司)为用户的空间是不允许的。

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

提前致谢!

Solutions Collecting From Web of "如果用户按下空格,如何从edittext立即删除空格?"

解决scheme通常要简单得多:

 @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 } } 

这不应该有以前的尝试的问题。

 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); } } 

setSelectionEditText的结尾再次设置光标:

 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(); } }}); 

要立即删除空间,您可以通过两种方式来实现。

一个简单的解决scheme,您可以将数字设置为您的编辑文本。

 android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 

第二种方法可以设置一个filter

 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; } } 
 @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])

像这样设置select,允许您在edittext中间input或粘贴文本,而不会丢失光标位置

使用inputfilter来实现这一点的一个更简单的方法

 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; } }}); 

这将立即删除由用户input的空间,并提供像禁用空间一样的外观。

我的相对简单的解决scheme,即时删除空格而不删除 EditText spannables (样式):

  1. 开始时删除:

      @Override public void afterTextChanged(Editable s) { int i; for (i = 0; i < s.length() && Character.isWhitespace(s.charAt(i)); i++) { ; } s.replace(0, i, ""); } 

基本就是这样,但你也可以这样做:

  1. 在开始时删除(不中断第一个input):

      @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. 在开始和结束时删除(允许1个空白结束以方便input):

      @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(), ""); }