I'm using the below InputFilter to filter out invalid (ASCII with decimal value above 127) and the EditText displays the text twice when an invalid character is entered. I do want the EditText to show the valid characters, below is an example of what happens.
-user enters XYZ€ in the EditText component
-toast message appears on the screen stating "Invalid non-Ascii Character"
-EditText component shows xyz on the screen which is what I expected
-user enters a valid character, A so the screen shows XYZA
-InputFilter runs and returns XYZA but XYZXYZA appears in the EditText component which is not correct. Its duplicating the XYZ
Any ideas on why its duplicating the entered text after processing an invalid character?
Screen:
<EditText android:id="@+id/editText"
android:layout_width="fill_parent" android:layout_height="120dp"
android:layout_marginTop="10dp" android:layout_marginLeft="10dp"
android:layout_marginRight="10dp" android:maxLength="45"
android:focusable="true" android:inputType="text"
android:cursorVisible="true" android:imeOptions="actionDone"
/>
Activity:
public class EditTextActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
EditText eText = (EditText) findViewById(R.id.editText);
setAsciiTextFilter();
}
private void setAsciiTextFilter() {
InputFilter filter = new InputFilter() {
int asciiNo;
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
asciiNo = source.charAt(i);
if(asciiNo > 127) {
toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT);
//Replace the invalid ascii character with empty String
return source.toString().replace(source.charAt(i)+"", "");
}
}
return null;
}
};
eText.setFilters(new InputFilter[]{filter});
}
}
New Attempt:
InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
if (source instanceof SpannableStringBuilder) {
SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source;
for (int i = end - 1; i >= start; i--) {
char currentChar = source.charAt(i);
int ascii = currentChar;
if (ascii > 127) {
sourceAsSpannableBuilder.delete(i, i+1);
toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT);
}
}
return source;
} else {
StringBuilder filteredStringBuilder = new StringBuilder();
for (int i = 0; i < end; i++) {
char currentChar = source.charAt(i);
int ascii = currentChar;
if (ascii <= 127) {
filteredStringBuilder.append(currentChar);
}
}
return filteredStringBuilder.toString();
}
}
};