DylanCaiCoding / ViewBindingKTX

The most comprehensive utils of ViewBinding. (最全面的 ViewBinding 工具,支持 Kotlin 和 Java 用法,支持 BRVAH,支持封装到基类,支持 DataBinding,支持选择是否使用反射)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

为什么使用lazy延迟加载呢,如果Activity的onCreate里没有使用binding,就不会调用setContentView

phoenixsky opened this issue · comments

commented

RT

用延时委托是因为不能一开始就创建 binding 对象,否则要用 lateinit var 手动创建。并且多数情况是会使用 binding 对象初始化,比如设置点击事件或者设置 Adapter,所以延时委托创建对象时调用了 setContentView(),可以省去一次方法的调用。

对于一开始不会用到 binding 的情况呢,可以在构造函数传入布局 id。我在文档里补充下吧

class MainActivity : AppCompatActivity(R.layout.activity_main) {
  // ...
}
commented

我现在的场景比较特殊,activity的onCreate里 先弹窗 弹窗关闭才 会需要去使用binding,就导致了 弹窗关闭之前activity的layout一直没有加载。

上来就创建binding对象不行么,如果是因为没有activity还没有onCreate的话,
是否可以通过 lifecycleScope.launchWhenCreated { }来代替延时委托呢?

不能一开始就创建,因为用到了 layoutInflater,都还没初始化呢,会报空指针。

有三种方式应对这个情况:

  1. 就是上面提到的在构造函数传布局 id,先用布局进行展示,后面用到 binding 会替换。
class MainActivity : AppCompatActivity(R.layout.activity_main) {
  // ...
}
  1. 手动调用一次 setContentView() 方法。
class MainActivity : AppCompatActivity() {
  private val binding: ActivityMainBinding by binding()

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(binding.root)
  }
}
  1. 改用封装到基类的方式使用。

已在文档增加这种情况的应对方式。