我注意到Kotlin Android Extensions的合成属性在某些情况下有点奇怪。在我的活动中使用它们并没有出现任何问题,但在视图持有者中,它只是不停地调用findViewById()
而不是_$_findCachedViewById()
。请注意,我使用的是最新的Android Studio和最新的插件(以及最新的Kotlin版本)。
所以,有一段这样的代码:
class Holder(override val containerView: View) :
RecyclerView.ViewHolder(containerView), LayoutContainer {
fun bind() {
containerView.my_text_view.text = "Hello Stackoverflow!"
itemView.my_another_view.text = "Foo"
}
}
我在以下Java代码中的结果:
TextView var10000 = (TextView)this.getContainerView().findViewById(id.my_text_view);
...
var10000 = (TextView)var1.findViewById(id.my_another_view);
...
据我所知,这与视图缓存无关,所以这是一个问题。最有趣的部分是代码中生成的_$_findCachedViewById()
和_$_clearFindViewByIdCache()
方法做,但它们未被使用。
即使是从网上下载的项目,以下问题仍然存在。
我认为这是某种错误吗?生成的Java代码是否真的按预期工作?
答案 0 :(得分:1)
The View Caching documentation声明缓存只能在Activity
,Fragment
,View
或LayoutContainer
上完成:
默认情况下,Android Extensions会为每个容器(
Activity
,Fragment
,View
或LayoutContainer
实现)添加隐藏缓存功能和存储字段。 EM>科特林
因此,您需要与您的观看者一起实施kotlinx.android.extensions.LayoutContainer
。它仍然是一个实验性功能,所以你必须启用它:
androidExtensions {
experimental = true
}
然后你必须直接在实例上调用合成属性。每次调用这些作为View
的属性都会导致未缓存的调用。
因此,您应该直接使用ontainerView.my_text_view
或itemView.my_another_view
,而不是使用my_text_view
或my_another_view
。
因此,使用任何kotlinx.android.synthetic.main.activity_main.view.*
会导致对findViewById()
的未缓存调用。