簡體   English   中英

Kotlin:EditText 在 afterTextChanged() 中為 null

[英]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 ,對嗎?

對。 但是您錯過了在“內部”膨脹的FragmentLayout被破壞的順序。 這兩個的銷毀不是同時完成的 - Layout首先被銷毀。

如您所見, TextWatcher是一個匿名內部類實例,它保持對其外部類的引用,即您的Fragment該類將最后銷毀。 這里的關鍵點是,來自TextWatcher EditText中的任何文本更改都是異步完成的 - 您的應用程序的進程視圖從系統中的另一個進程(軟鍵盤應用程序( 默認))獲取“通知”。

如果在您的EditText已被銷毀但您的Fragment尚未銷毀時出現此類“通知”,您將獲得NPE

如何預防?

只需使用phone_number_input?.error = ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM