与Android的Kotlin:基类和Kotlin Android扩展
所以我使用Kotlin Android Extensions
,我觉得它很容易使用,非常值得。 没有更多的findViewById
或Butterknife.Bind(...)
。 除了一种情况,我没有发现任何问题。
在基类中,例如, BaseActivity
,通常会有一堆视图出现在所有布局中,例如工具栏。 和常见的操作,如changeToolbarColor()
或setToolbarTitle()
。
在这种简单的情况下,我不能使用Kotlin Android Extensions
,因为它是一个基类,视图本身将出现在多个布局上,而且不能被属性导入。 在这种情况下,我只是简单地使用by lazy {find(...)
。
有没有什么办法可以用内置的android扩展插件来完成?
Kotlin Android Extensions
为给定布局上的每个元素生成扩展函数。 由于扩展方法存在于inheritance模型之外,所以没有办法像abstract val toolbar:Toolbar
那样定义一个通用协议abstract val toolbar:Toolbar
父级abstract val toolbar:Toolbar
。
然而,在扩展方法下,扩展方法只执行findById
,如果在布局上存在给定的ID,它将获取元素。 这意味着如果你在你的布局中保持你的公共元素相同的ID(即:所有的工具栏@id/toolbar
),你可以创建一个虚拟的布局与你的公共元素和他们各自的ID。 这种布局将作为一种接口,允许您import kotlinx.android.synthetic.main.base_activity_dummy.*
,从而生成所需的扩展方法。
通过以上操作, this.toolbar
上的BaseActivity
将获取具体活动的实际项目,而不是虚拟布局上的元素。
当然,这种方法虽然方便,却容易出错,并且可能会让你的程序对外人非常困惑。 但是,再次,不会比在任何地方调用findById
更容易出错。