是否可以在静态方法中使用View Binding?
是否可以在静态方法中使用View Binding
结论:不可以直接在伴生对象(Kotlin中等价Java静态方法)中访问Fragment实例的View Binding对象
原因:
- 你代码中的
binding是Fragment类的普通成员属性,仅会在Fragment实例完成视图创建(onViewCreated生命周期执行后)完成初始化,和具体的Fragment实例、对应视图生命周期强绑定 - 伴生对象属于类本身的静态作用域,不属于任何Fragment实例,天然无法直接访问类的普通成员属性,强行持有实例的binding还会导致内存泄漏
可行实现方案
方案1:方法移为伴生对象外的普通成员方法
如果这个方法仅服务于当前Fragment的实例,直接移出伴生对象即可:
class SomeFragment : FragmentBinding<SomeFragmentBinding>() { fun someRandomFunction() { // 可直接访问当前实例的binding对象 binding.textView.text = "Test" } }
方案2:将binding作为参数传入静态方法
如果逻辑需要复用,可以把绑定对象作为参数传递,不要在静态域长期存储:
class SomeFragment : FragmentBinding<SomeFragmentBinding>() { companion object { fun someRandomFunction(binding: SomeFragmentBinding) { binding.textView.text = "Test" } } // 在Fragment实例的视图生命周期内调用 fun initView() { someRandomFunction(binding) } }
注意:禁止将Fragment/Activity的binding对象长期存储在静态变量中,会持有视图引用导致组件无法被正常回收,引发内存泄漏。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

