Kotlin与Android:基类和Kotlin Android扩展

joh*_*crq 7 android findviewbyid kotlin

所以我用过Kotlin Android Extensions,我觉得它很容易使用,非常值得.没有更多findViewByIdButterknife.Bind(...).除了一种情况外,我发现这一切都没有问题.

例如,在基类中,BaseActivity通常会有一堆视图出现在所有布局中,例如工具栏.和常见的操作changeToolbarColor(),或setToolbarTitle().

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

有没有办法用内置的Android扩展插件完成这个?

Log*_*ain 5

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

但是,在引擎盖下,扩展方法只能执行findById,如果布局上存在给定的ID,它将获取该元素.这意味着如果为布局中的公共元素保持相同的ID(即:所有工具栏都有@id/toolbar),则可以使用公共元素及其各自的ID创建虚拟布局.此布局将作为一种接口工作,允许您执行import kotlinx.android.synthetic.main.base_activity_dummy.*并因此生成所需的扩展方法.

通过执行上述操作,this.toolbarBaseActivity将在具体活动上获取实际项目而不是虚拟布局上的元素.

当然,这种技术虽然方便,但容易出错,并且可能会使您的程序对于局外人来说非常混乱.但同样,它不会比findById在任何地方呼叫更容易出错.