gpt4 book ai didi

android - Kotlin:EditText 在 afterTextChanged() 中为空

转载 作者:搜寻专家 更新时间:2023-11-01 09:21:25 25 4
gpt4 key购买 nike

我有一个 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,对吗?如何预防?

最佳答案

How can that happen?

最有可能的情况是,发生这种情况时,您的应用会在用户输入时进入前台(例如,由于来电)。

If Fragment is destroyed, TextWatcher shouldn't be called, right?

没错。但是您错过了 FragmentLayout 在其“内部”膨胀并被销毁的顺序。这两个的销毁不是同时完成的 - Layout 首先被销毁。

如您所见,TextWatcher 是一个 anonymous inner class instance that keeps reference to its outer class ,您的 Fragment,最后销毁。这里的关键点是,来自 TextWatcherEditText 中的任何文本更改都是异步完成的 - 您的应用程序的进程 View 从系统中的另一个进程获取“通知”,soft键盘应用程序 ( default one )。

如果这样的“通知”在您的 EditText 已被销毁但您的 Fragment 尚未销毁时出现,您将得到 NPE .

How can it be prevented?

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

关于android - Kotlin:EditText 在 afterTextChanged() 中为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54926745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com