Tôi đã thử nghiệm giải pháp của @ Jeff trên phiên bản 4.2, 4.4, 6.0. Trên 4.2 và 6.0, nó hoạt động tốt. Nhưng trên 4.4, nó không hoạt động.
Tôi đã tìm thấy một cách dễ dàng để giải quyết vấn đề này. Điểm mấu chốt là chèn một ký tự ẩn vào nội dung của EditText ngay từ đầu và không để người dùng di chuyển con trỏ trước ký tự này. Cách của tôi là chèn một ký tự khoảng trắng với ImageSpan of Zero Width trên đó. Đây là mã của tôi.
@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);
}
}
}
Và chúng tôi cần tùy chỉnh một EditText có 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);
}
}
Và bước cuối cùng
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));
}
}
});
Và bây giờ, chúng tôi đã hoàn tất ~ Chúng tôi có thể phát hiện sự kiện khóa xóa lùi khi EditText không có nội dung thực tế và người dùng sẽ không biết gì về thủ thuật của chúng tôi.