我面临着完全相同的挑战并想出了一个解决方案。
只需将以下类复制粘贴到您的项目中:
OnTextChangedListener.class
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
public class OnTextChangedListener implements TextWatcher {
private static final String TAG = OnTextChangedListener.class.getSimpleName();
private boolean isManualChange = false;
private EditText mEditText;
private char[] consumeChars;
public OnTextChangedListener(char[] consumeChars, EditText editText){
mEditText = editText;
if(consumeChars == null){
this.consumeChars = new char[0];
} else{
this.consumeChars = consumeChars;
}
}
public OnTextChangedListener(){
this.consumeChars = new char[0];
}
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
String newString = charSequence.toString();
if(containsConsumeChar(newString)){
newString = removeConsumeChars(newString);
int cursorPos = mEditText.getSelectionStart(); // or getSelectionEnd() doesn't matter
isManualChange = true;
mEditText.setText(newString);
int maxPos = newString.length();
mEditText.setSelection(cursorPos > maxPos ? maxPos : cursorPos);
} else if(before != count && !isManualChange){
Log.d(TAG, "Text (actually) changed!");
String text = charSequence.toString();
// calls your own implementation if you have one
onTextActuallyChanged(text, start, before, count);
} else{
Log.d(TAG, "consumed manual change");
isManualChange = false;
}
}
@Override
public void afterTextChanged(Editable editable) {
}
public void onTextActuallyChanged(String newText, int start, int lengthBefore, int lengthNow){
}
public void onCharacterConsumed(char consumed){
}
private boolean containsConsumeChar(String text){
for(char c : consumeChars){
if(text.contains(""+c)) return true;
}
return false;
}
private String removeConsumeChars(String text){
for(char c : consumeChars){
if(text.contains(""+c)){
Log.d(TAG, "consumed all '" + c + "'s");
text = text.replaceAll(""+c, "");
// calls your own implementation if you have one
onCharacterConsumed(c);
}
}
return text;
}
}
用法:
OnTextChangedListener consumeThis = new OnTextChangedListener(new char[]{'#'}, myEditText);
myEditText.addTextChangedListener(consumeThis);
或
myEditText.addTextChangedListener(new OnTextChangedListener(new char['#'], myEditText){
@Override
public void onCharacterConsumed(char consumed) {
// TODO: implement your magic here
}
});