2016-11-13 30 views
15

Làm thế nào để bạn xây dựng một biểu thức lambda cho EditText addTextChangeListener trong Kotlin? Bên dưới đưa ra một lỗi:Kotlin addTextChangeListener lambda?

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

Lỗi gì? – voddan

Trả lời

0

Điều này có vẻ gọn gàng:

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() mất TextWatcher là giao diện với 3 phương pháp. Những gì bạn đã viết sẽ chỉ hoạt động nếu TextWatcher chỉ có 1 phương pháp. Tôi sẽ đoán lỗi bạn đang nhận được liên quan đến lambda của bạn không thực hiện 2 phương pháp khác. Bạn có 2 tùy chọn về sau.

1) Mương các lambda và chỉ sử dụng một lớp bên trong vô danh

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) Tạo một phương pháp mở rộng, do đó bạn có thể sử dụng một biểu thức lambda:

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()) 
     } 
    }) 
} 

Và sau đó sử dụng phần mở rộng như như vậy:

editText.afterTextChanged { doSomethingWithText(it) } 
+2

Không chắc chắn nếu sở thích cá nhân hoặc phong cách tốt hơn, nhưng chức năng mở rộng của bạn có thể được chuyển đổi thành phần thân ('fun foo() = ...') –

+1

@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Bạn nói đúng là nó có thể được chuyển đổi. Tuy nhiên, đối với các hàm dài hơn một dòng, tôi thích có các dấu ngoặc xung quanh để đánh dấu rõ vị trí bắt đầu và dừng của hàm. Tôi tin rằng nó làm tăng khả năng đọc, nhưng nó hoàn toàn là một sở thích phong cách. Tôi nghĩ rằng nó có thể được lập luận cả hai cách :) –

+0

@LEM Adane xin vui lòng chấp nhận câu trả lời này nếu nó giúp bạn. –

0

Một giải pháp thay thế khác là thư viện KAndroid được tìm thấy here.

Sau đó, bạn có thể làm một cái gì đó như thế này ...

editText.textWatcher { afterTextChanged { doSomething() } } 

Rõ ràng nó là quá mức để sử dụng toàn bộ một thư viện để giải quyết vấn đề của bạn, nhưng nó cũng đi kèm với một loạt các phần mở rộng hữu ích khác mà loại bỏ mã boilerplate trong SDK Android.