मैंने संस्करण 4.2, 4.4, 6.0 पर @ जेफ के समाधान का परीक्षण किया है। 4.2 और 6.0 पर, यह अच्छी तरह से काम करता है। लेकिन 4.4 पर, यह काम नहीं करता है।
मुझे इस समस्या के आसपास काम करने का एक आसान तरीका मिला। मुख्य बिंदु यह है कि एडिटिंग कैरेक्टर में एक अदृश्य कैरेक्टर को भीख मांगने के लिए एडिटटेक्स्ट में डाला जाए और इस कैरेक्टर से पहले यूजर को कर्सर न हिलाने दें। मेरा तरीका यह है कि उस पर शून्य चौड़ाई के एक ImageSpan के साथ एक सफेद-अंतरिक्ष चरित्र डालें। यहाँ मेरा कोड है।
@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);
}
}
}
और हमें कस्टम की जरूरत है एक EditText जिसमें एक 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);
}
}
और आखिरी कदम
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));
}
}
});
और अब, हम कर रहे हैं ~ हम बैकस्पेस कुंजी ईवेंट का पता लगा सकते हैं जब EditText में कोई वास्तविक सामग्री नहीं है, और उपयोगकर्ता को हमारी चाल के बारे में कुछ नहीं पता होगा।