Android edittext добавляет и удаляет добавление

Я пытаюсь сделать editText, где я вставляю текст. После каждых трех символов я хочу вставить тире.

Пример:

Тип: 123

Результат:123-

Теперь, когда курсор находится за тире, и вы нажимаете «Удалить», я хочу удалить тире и символ за тире. Например:

123-

результат после удаления ключа: 12. Как это сделать. Спасибо за совет.

ИЗМЕНИТЬ

мой код:

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

}

Я обнаружил, что Android 4.4.2 и более поздние версии не поддерживают keyevent.


person user3468921    schedule 08.10.2015    source источник


Ответы (3)


Меня вдохновил этот ответ на достижение того, чего вы хотите:

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

  });
person Rami    schedule 08.10.2015

onTextChanged вызывается каждый раз, когда вы что-то добавляете и удаляете. Итак, если ваша строка имеет длину 3, вы добавляете свой - и новая длина равна 4. Если вы нажмете удалить (новая длина снова равна 3), вызывается onTextChanged и - снова добавляется. Так что добавляйте что-то только в том случае, если ничего не было удалено из текста.

if (count > before) {
         if (count == 3 || count == 7) {
             str = str + "-";
         } else {
             return;
         }
         input.setText(str);
         input.setSelection(input.getText().length());
}
person Tobi    schedule 08.10.2015

Я довольно новичок в программировании для Android. Тем не менее, я думаю, что каждый раз, когда вы вызываете setText, вы запускаете новое событие onTextChanged. В моем приложении я удаляю прослушиватель, устанавливаю текст, а затем снова добавляю прослушиватель, чтобы избежать этой проблемы. Но для этого вам придется сохранить ссылку на TextWatcher.

т.е. учитывая, что ваша активность расширяет TextWatcher:

edittext.removeTextChangedListener(this);
editText.setText(str);
edittext.addTextChangedListener(this);

Вы также можете поместить курсор в конец, используя:

myedittext.append("");
person Yuta73    schedule 08.10.2015