2016-11-13 13 views
15

आप कोटलिन में EditText addTextChangeListener के लिए लैम्ब्डा अभिव्यक्ति कैसे बनाते हैं? नीचे एक त्रुटि देता है:कोटलिन addTextChangeListener lambda?

passwordEditText.addTextChangedListener { charSequence -> 
    try { 
     password = charSequence.toString() 
    } catch (error: Throwable) { 
     raise(error) 
    } 
} 
+1

यह क्या त्रुटि देता है? – voddan

उत्तर

0

यह साफ दिखता है:

passwordEditText.setOnEditorActionListener { 
    textView, keyCode, keyEvent -> 
    try { 
     val DONE = 6 
     if (keyCode == DONE) { 
      password = passwordEditText.text.toString() 
     } 
    } catch (error: IllegalStateException) { 
     alert("Invalid Input!", error.message as String) 
     passwordEditText.text.clear() 
    } catch (error: Exception) { 
     raise(error) 
    } 
    false 
} 
47

addTextChangedListener() एक TextWatcher जो 3 तरीकों के साथ एक अंतरफलक है लेता है। आपने जो लिखा वह केवल तभी काम करेगा जब TextWatcher में केवल 1 विधि थी। मैं अनुमान लगा रहा हूं कि आप जो त्रुटि प्राप्त कर रहे हैं वह आपके लैम्ब्डा से संबंधित है जो अन्य 2 तरीकों को लागू नहीं करती है। आपके पास 2 विकल्प आगे बढ़ रहे हैं।

1) लैम्ब्डा खाई और बस ताकि आप एक लैम्ब्डा अभिव्यक्ति का उपयोग कर सकते हैं एक गुमनाम आंतरिक वर्ग

editText.addTextChangedListener(object : TextWatcher { 
    override fun afterTextChanged(p0: Editable?) { 
    } 

    override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { 
    } 

    override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { 
    } 
}) 

2) एक विस्तार पद्धति बनाएं का उपयोग करें:

fun EditText.afterTextChanged(afterTextChanged: (String) -> Unit) { 
    this.addTextChangedListener(object : TextWatcher { 
     override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { 
     } 

     override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { 
     } 

     override fun afterTextChanged(editable: Editable?) { 
     afterTextChanged.invoke(editable.toString()) 
     } 
    }) 
} 

और फिर जैसे एक्सटेंशन का उपयोग इसलिए:

editText.afterTextChanged { doSomethingWithText(it) } 
+2

सुनिश्चित नहीं है कि व्यक्तिगत वरीयता या बेहतर शैली है, लेकिन आपके एक्सटेंशन फ़ंक्शन को अभिव्यक्ति निकाय में परिवर्तित किया जा सकता है ('fun foo() = ...') –

+1

@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu आप सही हैं कि इसे परिवर्तित किया जा सकता है। हालांकि, एक पंक्ति से अधिक लंबे कार्यों के लिए, मुझे आसपास के ब्रैकेट्स को स्पष्ट रूप से चिह्नित करने के लिए पसंद है जहां फ़ंक्शन शुरू होता है और बंद हो जाता है। मेरा मानना ​​है कि यह पठनीयता बढ़ाता है, लेकिन यह पूरी तरह से एक शैली वरीयता है। मुझे लगता है कि इसे दोनों तरीकों से तर्क दिया जा सकता है :) –

+0

@LEM Adane कृपया इस उत्तर को स्वीकार करें यदि यह आपकी मदद करता है। –

0

एक अन्य विकल्प KAndroid लाइब्रेरी here मिली है।

फिर

आप कुछ इस तरह कर सकता है ...

editText.textWatcher { afterTextChanged { doSomething() } } 

जाहिर है यह आपकी समस्या का समाधान करने के लिए एक पूरी लाइब्रेरी का उपयोग करने के अत्यधिक है, लेकिन यह भी अन्य उपयोगी एक्सटेंशन है कि बॉयलरप्लेट कोड को खत्म करने की एक सीमा के साथ आता है एंड्रॉइड एसडीके में।