【发布时间】:2020-03-06 16:22:06
【问题描述】:
所以,我做了一些研究,似乎抽象基类的init/构造函数中的视图膨胀并不是真正的最佳实践。我知道这是因为基类初始化程序发生在派生类的 init/ 构造函数之前。由于抽象类不是最终类,因此有一条关于this 在init 块中泄露的很好的IDE 消息。
这就是我所追求的:
abstract class Foo @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {
private val myView: View
init {
// todo@patches fix leaking "this"
View.inflate(context, R.layout.view_foo, this)
myView = requireNotNull(findViewById(R.id.my_view))
}
}
class Bar @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : Foo(context, attrs, defStyleAttr)
我真的不想在派生类的 init 中添加任何内容,也不想让 myView 成为稍后在抽象类中设置的可空/可变变量。
有没有其他人觉得这有点令人沮丧或有什么建议?从基类中扩展相同的布局似乎并不少见。
【问题讨论】:
-
这能回答你的问题吗? Leaking this in constructor warning
-
很抱歉,但事实并非如此。它仅建议抑制警告,并没有提供真正修复此警告的替代方法。它也与视图无关,对 Android 有不同的约束。
-
一般建议是不要在构造函数中工作,因此我建议将这个逻辑移到其他地方。重构代码以便此类采用已初始化的
myView是可行的方法。
标签: android kotlin android-view android-custom-view