【问题标题】:Kotlin Android Extensions : java.lang.IllegalStateException: view must not be nullKotlin Android 扩展:java.lang.IllegalStateException:视图不能为空
【发布时间】:2019-01-22 13:37:01
【问题描述】:

我在我的片段中使用 kotlin 视图绑定。在某些情况下,应用程序会因IllegalStateException 而崩溃并查看为 null,我在可运行程序中访问它,该可运行程序使用延迟为 1.5 秒的处理程序调用。

 numberRunnable = Runnable {
        if (mobileView.text.toString().isNotEmpty() && Utility.isMobileNumberValid(mobileView.text.toString())) {
            presenter.getCustomerDetails(Utility.getServerAcceptableContactNumber(mobileView.text.toString()))
        }
    }

mobileView 为空

处理程序代码: handler.postDelayed(numberRunnable, 1500)

我知道有一种可能性可以检查我的片段中是否有isAdded,但由于我无法复制错误,我不确定它是否是问题所在。

【问题讨论】:

  • 如果您的片段处于尚未调用onCreateView 的状态 - 或者它已经调用了onDestroyView,则视图将始终为空。
  • 从onViewCreated()调用
  • 您是否在不同的片段布局中使用“mobileView” id?如果是这样,您应该检查导入列表中的 kotlin 绑定类(“kotlinx.android.synthetic....”)是否对应于片段布局。

标签: android kotlin android-view kotlin-android-extensions


【解决方案1】:

该操作可能在用户离开 Fragment 并调用 onDestroy() 后运行。在这种状态下,Fragment 中不会有 View 实例。

一个简单的解决方法是创建一个全局变量来检查片段的创建状态。将其设置为onViewCreated() 中的trueonDestroyView() 中的false(在超级调用之前)。然后在执行逻辑之前检查 Runnable 中的值。

更好的解决方案(尽管这取决于竞争条件并且需要将每个 Runnable 分配给一个全局变量)可能是使用 Handler.removeCallbacks() 方法并传递所有 Runnable。

override fun onDestroyView() {
    handler.removeCallbacks(numberRunnable)
}

另一种可能性是简单地说 View 可以为空:

mobileView?.let {
    //Your stuff goes in here
    //You can reference mobileView using "it"
}

【讨论】:

    【解决方案2】:

    您不能假设 1.5 秒后视图仍附加到视图层次结构。

    handler.removeCallbacks(numberRunnable) 添加到您的onStop() 生命周期回调中,以在片段不再处于活动状态时删除numberRunnable

    还要问自己为什么需要延迟。

    【讨论】:

      猜你喜欢
      • 2018-05-04
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多