保留退格键不会一一清除文本

Huo*_*eng 4 android backspace android-edittext

我有一个EditText实现TextWatcher,但是Backspace键有问题。按住退格键时,前5个字符被一一清除,但是按住退格键时,转换为图像的后5个字符不能一一清除。

看图片:

在此处输入图片说明

  1. MainActivity.java

    public class MainActivity extends AppCompatActivity {
    Spannable.Factory spannableFactory;
    
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    spannableFactory = Spannable.Factory
            .getInstance();
    
    final EditText editText = (EditText) findViewById(R.id.editText);
    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) {
            editText.removeTextChangedListener(this);
            if (s.length() >= 5) {
                editText.setText(getTextToIcon(getApplicationContext(), s));
            }
            if(count!=0){                               // != key delete
                if (s.length() - 1 > start) {
                    editText.setSelection(start + 1);
                } else {
                    editText.setSelection(s.length());
                }
            }else{                                      // = key delete
                editText.setSelection(start);
            }
    
            editText.addTextChangedListener(this);
        }
    
        @Override
        public void afterTextChanged(Editable s) {}
    });
    }
    
    
    public Spannable getTextToIcon(Context context, CharSequence text) {
    StringBuilder stringBuilder = new StringBuilder(text);
    Spannable spannable = spannableFactory.newSpannable(stringBuilder);
    int index = text.length() - 1;
    for(int i = 5; i<=index; i++){
        spannable.setSpan(new ImageSpan(context, android.R.drawable.star_on),
                i, i + 1,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
    return spannable;
    }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:maxLength="10"
        android:inputType="number" />
    </LinearLayout>
    
    Run Code Online (Sandbox Code Playgroud)

Joh*_*Dev 5

兄弟,有错误的代码如下:

if (s.length() >= 5) {
    editText.setText(getTextToIcon(getApplicationContext(), s));
}
Run Code Online (Sandbox Code Playgroud)

您应该将其更改为:

if (count != 0 && s.length() >= 5) {
    // just set the text to the icon in input state instead of pressing delete key in soft method
    editText.setText(getTextToIcon(getApplicationContext(), s));
}
Run Code Online (Sandbox Code Playgroud)

希望对您有所帮助。