Как мгновенно удалить пробел из текста редактирования, если пользователь нажимает пробел? - PullRequest
7 голосов
/ 18 марта 2012

У меня есть 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) {}
        }); 

Я не могу определить onkeydown в методе afterTextChaned, так как он выдает ошибку.

 public boolean onKeyDown(int keyCode, KeyEvent event) {
                super.onKeyDown(keyCode, event);

                if (keyCode == KeyEvent.KEYCODE_SPACE) {

                }
    }

Так что это не работает (синтаксическая ошибка, неуместная конструкция для int keyCode.

Заранее спасибо!

Ответы [ 7 ]

39 голосов
/ 18 марта 2012

Решение, как правило, намного проще:

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

Это не должно иметь проблем предыдущих попыток.

3 голосов
/ 29 марта 2016

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 голосов
/ 18 марта 2012
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);
    }
}
1 голос
/ 06 сентября 2017
@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])

Настройка выбора, подобная этой, позволяет вводить или вставлять текст в середине текста редактированиябез потери позиции курсора

0 голосов
/ 19 октября 2017

Мое относительно простое решение для мгновенного удаления пробелов без удаления 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, "");
    }
    

В основном это все, но вы также можете сделать:

Удалить при запуске (без прерывания первого ввода):

    @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(), "");
}
0 голосов
/ 26 сентября 2017

Еще один простой способ добиться этого с помощью входного фильтра

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

Это немедленно удалит пространство, введенное пользователем, и создаст вид, будто пространство отключено.

0 голосов
/ 22 апреля 2016

Для мгновенного удаления пространства вы можете достичь его двумя способами.

Одно простое решение, вы можете установить цифры для вашего текста редактирования.

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;


      }
     }
...