2016-01-17 3 views
0

Как удалить два символа одновременно с фильтром?Android EditText InputFilter

Я пытаюсь применить простой фильтр к EditText.
Он должен работать следующим образом:
(хочет получить формат: 1234 5678 ....)

===> Редакция: Первая часть работает хорошо.

1) когда в EditText есть 4 цифры, и я вхожу в 5-ю цифру -
сначала должно появиться пробел, а затем эта цифра.
2) И мне нужно обратное для этого (во время удаления символов) -
пространство должно быть удалено с помощью 5-й цифры.

Что не так с моим кодом?

editText.setFilters(new InputFilter[]{new DigitsKeyListener(Boolean.FALSE, Boolean.TRUE) { 

    @Override 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 

     // any chars except backspace 
     if (!source.equals("")) { 
      if (dest.length() == 4) { 
       // here I must add a space and then the source 
       // ===> EDITED: 
       return " " + source; 
       // return super.filter(" " + source, start, end + 1, dest, dstart, dend + 1); 
      } // backspace entered 
     } else { 
      if (dest.length() == 6) { 
       // here I must delete the 6-th character 
       // and the space before 
       return super.filter(source, 0, 0, dest, 5, 6); 
      } 
     } 

     return null; 
    } 
}}); 
+0

, что это выход из приведенного выше кода? любая ошибка? – Lal

+0

Outout как будто нет фильтров: 1234567 ... – Androider

ответ

0

Пожалуйста, используйте этот

public class CustomFormatWatcher implements TextWatcher { 

    private int size; 

    public CustomFormatWatcher(int size) { 
     this.size = size; 
    } 

    @Override 
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

    } 

    @Override 
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

    } 

    @Override 
    public void afterTextChanged(Editable editable) { 
     char hyphen = ' '; 
     char c = 0; 
     if (editable.length() > 0) { 
      c = editable.charAt(editable.length() - 1); 
      if (c == hyphen) { 
       editable.delete(editable.length() - 1, editable.length()); 
      } 
     } 
     if (editable.length() > 0 && (editable.length() % size) == 0) { 
      c = editable.charAt(editable.length() - 1); 
      if (hyphen == c) { 
       editable.delete(editable.length() - 1, editable.length()); 
      } 
     } 
     if (editable.length() > 0 && (editable.length() % size) == 0) { 
      c = editable.charAt(editable.length() - 1); 
      // Only if its a digit where there should be a space we insert a hyphen 
      if (Character.isDigit(c) && TextUtils.split(editable.toString(), String.valueOf(hyphen)).length <= 3) { 
       editable.insert(editable.length() - 1, String.valueOf(hyphen)); 
      } 
     } 
    } 
} 

, а затем использовать

myEditText.addTextChangedListener(new CustomFormatWatcher()); 
+0

Какой размер следует передать новому CustomFormatWatcher (int size)? – Androider

+0

Размер должен быть, сколько символов вы хотите в edittext – sector11

+0

@ Androider это сработало? – sector11

0

Я предлагаю вам использовать TextWatcher форматировать EditText вход, потому что InputFilter обычно используются для ввода ограничений на то, что решение может быть введено не для форматирования текста.

Вы получите ваш желаемый результат с этим кодом:

String mTextValue; 
Character mLastChar = '\0'; // init with empty character 
int mKeyDel; 

myEditText.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

      String eachBlock[] = myEditText.getText().toString().split(" "); 

      myEditText.setOnKeyListener(new View.OnKeyListener() { 

      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 

        if (keyCode == KeyEvent.KEYCODE_DEL) 
         mKeyDel = 1; 
         return false; 
        } 
      }); 

      if (mKeyDel == 0) { 

       if (((myEditText.getText().length() + 1) % 5) == 0) { 
        myEditText.setText(myEditText.getText() + " "); 
        myEditText.setSelection(myEditText.getText().length()); 
       } 

       mTextValue = myEditText.getText().toString(); 

      } else { 

       mTextValue = myEditText.getText().toString(); 

       if (mLastChar.equals(' ')) { 
        mTextValue = mTextValue.substring(0, mTextValue.length() - 1); 
        myEditText.setText(mTextValue); 
        myEditText.setSelection(mTextValue.length()); 
       } 

       mKeyDel = 0; 

      } 

     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      if (s.length()>0) {// save the last char value 
       mLastChar = s.charAt(s.length() - 1); 
      } else { 
       mLastChar = '\0'; 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) {} 

}); 
+0

Спасибо. Почему я могу удалить только один символ в EditText? – Androider