Kotlin Android Extensions生成的函数从未使用过

问题描述 投票:1回答:1

我注意到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()方法确实在代码中生成,但它们没有被使用。

即使在从Web下载的项目中,以下问题仍然存在。

我认为这是某种错误吗?生成的Java代码是否真的按预期工作?

android kotlin kotlin-android-extensions
1个回答
1
投票

The View Caching documentation声称缓存仅在ActivityFragmentViewLayoutContainer上进行:

默认情况下,Android Extensions为每个用Kotlin编写的容器(ActivityFragmentViewLayoutContainer实现)添加隐藏缓存功能和存储字段。

所以你需要与你的视图持有者一起实现kotlinx.android.extensions.LayoutContainer 。它仍然是一个实验性功能,因此您必须启用它:

androidExtensions {
    experimental = true
}

然后,您必须直接在实例上调用合成属性。每次调用这些作为View的属性都会导致未缓存的调用。

因此,不要使用ontainerView.my_text_viewitemView.my_another_view,而应直接使用my_text_viewmy_another_view

因此,使用任何kotlinx.android.synthetic.main.activity_main.view.*都会导致对findViewById()的未缓存调用。

© www.soinside.com 2019 - 2024. All rights reserved.