Kotlin:EditText在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,对吗?如何预防?

那怎么会发生?

很可能发生这种情况时,您的应用在用户键入时将进入前景(例如,由于传入的呼叫)。

如果Fragment被销毁,则不应打电话给TextWatcher,对吗?

对。但是您缺少FragmentLayout在"内部"中膨胀的顺序。这两个的破坏不是同时进行的-Layout首先被销毁。

您可以看到,TextWatcher是一个匿名的内类实例,它可以涉及其外部类,即您的Fragment,该类别将在上次被销毁。这里的要点是,从 TextWatcher中的EditText中的任何文本更改都是异步完成的 - 您的应用程序的过程视图从系统中的另一个过程,软键盘应用程序(默认一个)中获取"通知"。

如果您的EditText曾被销毁,但您的Fragment没有,您会得到 npe 。。

如何预防?

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

相关内容

  • 没有找到相关文章

最新更新