android – 保持退格不会逐个清除文本

我有一个EditText实现TextWatcher但Backspace键有问题.
保持退格时,前5个字符逐个清晰,但保留退格时,转换为图像的最后5个字符不能逐个清除.

看图像:

android  – 保持退格不会逐个清除文本

> 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;
}
}

> 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>

解决方法:

兄弟,有bug的代码如下:

if (s.length() >= 5) {
    editText.setText(getTextToIcon(getApplicationContext(), s));
}

您应该将其更改为:

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));
}

希望它有所帮助.

上一篇:SDNU 1218.认路(最小生成树,最短路径规划)


下一篇:linux基本命令续