我正在使用以下InputFilter来过滤掉无效字符(ASCII十进制值大于127),当输入无效字符时,EditText会显示文本两次。但我希望EditText只显示有效字符。以下是发生的情况示例:
- 用户在EditText组件中输入XYZ€。 - 屏幕上出现Toast消息,指出“非ASCII字符无效”。 - EditText组件在屏幕上显示xyz,这正是我的预期。 - 用户输入一个有效字符A,因此屏幕显示XYZA。 - InputFilter运行并返回XYZA,但EditText组件中出现了XYZXYZA,这是不正确的。它重复了XYZ。
你有什么想法,为什么处理无效字符后会重复输入的文本?
屏幕截图:
- 用户在EditText组件中输入XYZ€。 - 屏幕上出现Toast消息,指出“非ASCII字符无效”。 - EditText组件在屏幕上显示xyz,这正是我的预期。 - 用户输入一个有效字符A,因此屏幕显示XYZA。 - InputFilter运行并返回XYZA,但EditText组件中出现了XYZXYZA,这是不正确的。它重复了XYZ。
你有什么想法,为什么处理无效字符后会重复输入的文本?
屏幕截图:
<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"
/>
活动:
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});
}
}
新尝试:
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();
}
}
};