所以我使用了Kotlin
Android Extensions,我觉得它很容易使用,非常值得.没有更多findViewById或Butterknife.Bind(…).除了一种情况外,我发现这一切都没有问题.
在基类中,例如BaseActivity,通常会有一堆视图出现在所有布局中,例如工具栏.和常见的操作,如changeToolbarColor()或setToolbarTitle().
在这个简单的情况下,我不能使用Kotlin Android Extensions,因为它是一个基类,视图本身将出现在多个布局上,并且不能导入属性.在这种情况下,我只是简单地使用lazy {find<>(…).
有没有办法用内置的Android扩展插件来实现?
解决方法
Kotlin Android Extensions为给定布局上的每个元素生成扩展函数.由于扩展方法存在于继承模型之外,因此无法定义像抽象val工具栏这样的公共协议:父项上的工具栏.
但是,在引擎盖下,扩展方法只执行findById,如果布局上存在给定的ID,它将获取该元素.这意味着如果在布局中为公共元素维护相同的ID(即:所有带@ id / toolbar的工具栏),则可以使用公共元素及其各自的ID创建虚拟布局.此布局将作为一种接口工作,允许您导入kotlinx.android.synthetic.main.base_activity_dummy.*,从而生成所需的扩展方法.
通过执行上述操作,BaseActivity上的this.toolbar将获取具体活动上的实际项目,而不是虚拟布局上的元素.
当然,这种技术虽然方便,但容易出错,并且可能会使您的程序对于局外人来说非常混乱.但同样,它不会比在任何地方调用findById更容易出错.