Saya telah menguji solusi @ Jeff pada versi 4.2, 4.4, 6.0. Pada 4.2 dan 6.0, ini bekerja dengan baik. Tetapi pada 4.4, itu tidak berhasil.
Saya menemukan cara mudah untuk mengatasi masalah ini. Poin kuncinya adalah memasukkan karakter yang tidak terlihat ke dalam konten EditText di awal, dan jangan biarkan pengguna menggerakkan kursor sebelum karakter ini. Cara saya adalah memasukkan karakter spasi putih dengan ImageSpan Lebar Nol di atasnya. Ini kode saya.
@Override
public void afterTextChanged(Editable s) {
String ss = s.toString();
if (!ss.startsWith(" ")) {
int selection = holder.editText.getSelectionEnd();
s.insert(0, " ");
ss = s.toString();
holder.editText.setSelection(selection + 1);
}
if (ss.startsWith(" ")) {
ImageSpan[] spans = s.getSpans(0, 1, ImageSpan.class);
if (spans == null || spans.length == 0) {
s.setSpan(new ImageSpan(getResources().getDrawable(R.drawable.zero_wdith_drawable)), 0 , 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
Dan kita perlu menyesuaikan EditText yang memiliki SelectionChangeListener
public class EditTextSelectable extends android.support.v7.widget.AppCompatEditText {
public interface OnSelectChangeListener {
void onSelectChange(int start, int end);
}
private OnSelectChangeListener mListener;
public void setListener(OnSelectChangeListener listener) {
mListener = listener;
}
...constructors...
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
if (mListener != null) {
mListener.onSelectChange(selStart, selEnd);
}
super.onSelectionChanged(selStart, selEnd);
}
}
Dan langkah terakhir
holder.editText.setListener(new EditTextSelectable.OnSelectChangeListener() {
@Override
public void onSelectChange(int start, int end) {
if (start == 0 && holder.editText.getText().length() != 0) {
holder.editText.setSelection(1, Math.max(1, end));
}
}
});
Dan sekarang, kita selesai ~ Kita dapat mendeteksi peristiwa kunci backspace ketika EditText tidak memiliki konten aktual, dan pengguna tidak akan tahu apa-apa tentang trik kita.