Search code examples
androidappendtextedit

Android edittext append and remove append


I'm trying to make editText, where I am inserting some text. After each three characters,I want to insert dash.

Example:

Type: 123

Result:123-

Now when cursor is behind dash and you press delete, I want to delete dash and character behind dash. For example:

123-

result after delete key: 12. How to do it. Thank you for advice.

EDIT

my code is:

 EditText editText;
boolean keyDel = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    editText = (EditText) findViewById(R.id.editText);
    editText.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_DEL) {
                keyDel = true;
            }
            return keyDel;
        }
    });

    editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            String str = s.toString();
            System.out.println(str.length());
            if (str.length() == 3) {
                str = str + "-";
            } else if (str.length() == 7) {
                str = str + "-";
            } else if (str.length() % 4 == 0 && keyDel == true) {
                str = str.substring(0, str.length() - 2);
            } else {
                return;
            }
            editText.setText(str);
            editText.setSelection(editText.getText().length());
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

}

I found Android 4.4.2 and higer doesn´t support keyevent.


Solution

  • I was inspired by this answer to achieve what you want:

        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) {
    
               boolean flag = true;
               String eachBlock[] = myEditText.getText().toString().split("-");
               for (int i = 0; i < eachBlock.length; i++) {
                    if (eachBlock[i].length() > 4) {
                        flag = false;
                    }
               }
               if (flag) {
    
                  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) % 4) == 0) {
                          myEditText.setText(myEditTex.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;
                   }
    
              } else {
                  myEditText.setText(mTextValue);
              }
    
           }
    
           @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) {}
    
      });