如果用户按下空格,如何从编辑文本中立即删除SPACE?

时间:2012-03-18 11:39:09

标签: android android-edittext textwatcher

我有一个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错误的构造。

提前谢谢你!

7 个答案:

答案 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 (样式)的即时空格删除的相对简单的解决方案:

  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, "");
    }
    
  2. 基本上就是这样,但你也可以这样做:

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