Android edittext追加和删除追加

Android edittext append and remove append

我正在尝试制作 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 和 higer 不支持 keyevent。

我自己对 android 编程还比较陌生。不过,我认为每次调用 "setText" 时都会触发一个新的 onTextChanged 事件。 在我的应用程序中,我删除了侦听器,设置文本,然后再次添加侦听器以避免此问题。但为此,您必须保存对 TextWatcher 的引用。

即给定你的 Activity extends TextWatcher:

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

您也可以将光标放在最后使用:

myedittext.append("");

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

我受到this answer的启发,实现了你想要的:

    String mTextValue;
    Character mLastChar = '[=10=]'; // 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 = '[=10=]';
            }
       }

       @Override
       public void afterTextChanged(Editable s) {}

  });