@ Jeff'in çözümünü 4.2, 4.4, 6.0 sürümlerinde test ettim. 4.2 ve 6.0'da iyi çalışıyor. Ancak 4.4'te çalışmıyor.
Bu sorunu aşmanın kolay bir yolunu buldum. Kilit nokta, başlangıçta EditText içeriğine görünmez bir karakter eklemek ve kullanıcının imleci bu karakterden önce hareket ettirmesine izin vermemek. Benim yöntemim, üzerinde Sıfır Genişlikli bir ImageSpan olan bir beyaz boşluk karakteri eklemektir. İşte kodum.
@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);
}
}
}
Ve bir SelectionChangeListener'a sahip özel bir EditText'e ihtiyacımız var.
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);
}
}
Ve son adım
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));
}
}
});
Ve şimdi, işimiz bitti ~ EditText gerçek içeriğe sahip olmadığında geri al tuşu olayını tespit edebiliriz ve kullanıcı hilemiz hakkında hiçbir şey bilmeyecektir.