具有 Android 的 Kotlin:基础 类 和 Kotlin Android 扩展

Kotlin with Android: Base classes and Kotlin Android Extensions

所以我用过Kotlin Android Extensions,我发现它非常好用,非常值得。不再 findViewByIdButterknife.Bind(...)。除了一种情况,我发现这一切都没有问题。

在基础class中,例如BaseActivity,通常会有一堆视图出现在所有布局中,例如工具栏。以及 changeToolbarColor()setToolbarTitle().

等常见操作

在这种简单的情况下,我不能使用 Kotlin Android Extensions,因为它是基础 class,视图本身将出现在多个布局中,但不能 属性 导入。在这种情况下,我只是简单地使用 by lazy {find<>(...).

有什么方法可以通过内置的 android 扩展插件来实现吗?

Kotlin Android Extensions 为给定布局上的每个元素生成一个扩展函数。由于扩展方法存在于继承模型之外,因此无法在父级上定义像 abstract val toolbar:Toolbar 这样的通用协议。

但是,在幕后,扩展方法仅执行 findById,如果给定的 ID 存在于布局中,它将获取元素。这意味着如果您在布局中为您的常用元素维护相同的 ID(即:所有带有 @id/toolbar 的工具栏),您可以使用您的常用元素及其各自的 ID 创建一个虚拟布局。此布局将用作一种界面,允许您执行 import kotlinx.android.synthetic.main.base_activity_dummy.* 并因此生成您想要的扩展方法。

通过执行上述操作,BaseActivity 上的 this.toolbar 将获取具体 activity 上的实际项目,而不是虚拟布局上的元素。

当然,这种技术虽然方便,但容易出错,并且可能使您的程序对于外行人来说非常混乱。但同样,它不会比到处调用 findById 更容易出错。