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) {}
});
我正在尝试制作 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) {}
});