8

我有一个 edittext 和一个 textwatcher 来监视 SPACE 是否到达。如果它是一个空间,我想立即删除它。或者,如果它是一个空间,我想确保它不会出现,但会以某种方式(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.

提前谢谢你!

4

7 回答 7

47

解决方案通常要简单得多:

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

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

于 2012-03-18T15:38:01.107 回答
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();
                    }
                }});
于 2016-03-29T15:55:17.767 回答
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);
    }
}
于 2012-03-18T16:07:06.787 回答
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中间输入或粘贴文本而不会丢失光标位置

于 2017-09-06T08:54:34.343 回答
1

我在不删除spannables(样式)的情况下即时删除空格的相对简单的解决方案EditText

  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. 在开始时移除(不中断第一个输入):

        @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 个空格以方便输入):

        @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(), "");
    }
    
于 2017-10-19T11:44:19.737 回答
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;


      }
     }
于 2016-04-22T11:42:37.547 回答
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;
        }
    }});

这将立即删除用户输入的空间,并呈现空间被禁用的外观。

于 2017-09-26T11:03:26.930 回答