与Android的Kotlin:基类和Kotlin Android扩展

所以我使用Kotlin Android Extensions ,我觉得它很容易使用,非常值得。 没有更多的findViewByIdButterknife.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更容易出错。