为什么使用lazy延迟加载呢,如果Activity的onCreate里没有使用binding,就不会调用setContentView
phoenixsky opened this issue · 4 comments
phoenixsky commented
RT
DylanCaiCoding commented
用延时委托是因为不能一开始就创建 binding 对象,否则要用 lateinit var 手动创建。并且多数情况是会使用 binding 对象初始化,比如设置点击事件或者设置 Adapter,所以延时委托创建对象时调用了 setContentView(),可以省去一次方法的调用。
对于一开始不会用到 binding 的情况呢,可以在构造函数传入布局 id。我在文档里补充下吧
class MainActivity : AppCompatActivity(R.layout.activity_main) {
// ...
}
phoenixsky commented
我现在的场景比较特殊,activity的onCreate里 先弹窗 弹窗关闭才 会需要去使用binding,就导致了 弹窗关闭之前activity的layout一直没有加载。
上来就创建binding对象不行么,如果是因为没有activity还没有onCreate的话,
是否可以通过 lifecycleScope.launchWhenCreated { }
来代替延时委托呢?
DylanCaiCoding commented
不能一开始就创建,因为用到了 layoutInflater,都还没初始化呢,会报空指针。
有三种方式应对这个情况:
- 就是上面提到的在构造函数传布局 id,先用布局进行展示,后面用到 binding 会替换。
class MainActivity : AppCompatActivity(R.layout.activity_main) {
// ...
}
- 手动调用一次 setContentView() 方法。
class MainActivity : AppCompatActivity() {
private val binding: ActivityMainBinding by binding()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
}
}
- 改用封装到基类的方式使用。
DylanCaiCoding commented
已在文档增加这种情况的应对方式。