मेरे पास digits के साथ एडिटटेक्स्ट है

<EditText
        ...
        android:digits="0123456789ABCDEFabcdef"
        android:inputType="textCapCharacters|textNoSuggestions" />

और मैं TextWatcher में इनपुट त्रुटि की जांच करता हूं

editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        Log.d(TAG, "beforeTextChanged");
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Log.d(TAG, "onTextChanged");
    }

    @Override
    public void afterTextChanged(Editable s) {
        Log.d(TAG, "afterTextChanged");
        try {
            int color = Color.parseColor(s.toString());
        } catch (Exception e){
            editText.setError("Wrong color");
        }
    }
});

लेकिन जब मैं कोई निषिद्ध वर्ण दर्ज करता हूं (उदाहरण के लिए, L) त्रुटि संदेश रीसेट हो जाता है, क्योंकि इनपुट बदल दिया गया था, लेकिन TextWatcher विधियों में से कोई भी नहीं कहा जाता है, शायद digits के कारण।

मैं किसी भी तरह digits को हटाए बिना और TextWatcher में निषिद्ध वर्णों को मैन्युअल रूप से प्रबंधित किए बिना इसे ठीक कर सकता हूं? हो सकता है कि ऐसी कोई विधि हो जिसे प्रत्येक इनपुट क्रिया पर बुलाए जाने की गारंटी हो?

0
Mikhail 19 अगस्त 2020, 18:22

1 उत्तर

सबसे बढ़िया उत्तर

मैंने पाया कि गलत कुंजी प्रेस इवेंट InputFilter में आते हैं। लेकिन यह xml से maxLength को ओवरराइड करता है (आप digits में परिभाषित वर्णों को अंतहीन रूप से दर्ज कर सकते हैं), इसलिए इसे कोड में मैन्युअल रूप से बनाना होगा।

InputFilter filter = new InputFilter(){
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        // Check here for input error
        return source;
    }
};
InputFilter.LengthFilter lengthFilter = new InputFilter.LengthFilter(7);
editText.setFilters(new InputFilter[]{hexFilter, lengthFilter});
0
Mikhail 20 अगस्त 2020, 17:21