[英]Kotlin: EditText is null in afterTextChanged()
我有一個EditText
並且我正在向其中設置錯誤或在文本更改后消除該錯誤。 然而,當我嘗試從afterTextChanged()
方法訪問EditText
時,不知何故我得到了NPE 。
phone_number_input.addTextChangedListener(object : TextWatcher() {
...
override fun afterTextChanged(s: Editable?) {
if (isValid(s.toString())
phone_number_input.error = null // <-- NPE happens here
else
phone_number_input.error = "Number is invalid"
}
})
它不是不斷地重現,但在上個月,從Android 4.4.2 到 6.0.1 的不同設備上發生了數十次崩潰。
怎么會這樣? 如果Fragment
被銷毀, TextWatcher
不應調用TextWatcher
,對嗎? 如何預防?
怎么會這樣?
最有可能的是,當發生這種情況時,您的應用程序會在用戶鍵入時(例如,由於來電)進入前台。
如果
Fragment
被銷毀,TextWatcher
不應調用TextWatcher
,對嗎?
對。 但是您錯過了在“內部”膨脹的Fragment
和Layout
被破壞的順序。 這兩個的銷毀不是同時完成的 - Layout
首先被銷毀。
如您所見, TextWatcher
是一個匿名內部類實例,它保持對其外部類的引用,即您的Fragment
,該類將最后銷毀。 這里的關鍵點是,來自TextWatcher
EditText
中的任何文本更改都是異步完成的 - 您的應用程序的進程視圖從系統中的另一個進程(軟鍵盤應用程序( 默認))獲取“通知”。
如果在您的EditText
已被銷毀但您的Fragment
尚未銷毀時出現此類“通知”,您將獲得NPE 。
如何預防?
只需使用phone_number_input?.error = ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.