Kotlin 的合成属性冲突

Kotlin's synthetic properties conflict

我是 Kotlin 新手。在其他非常有趣的事情中,我发现了 Android 扩展,according to the documentation 应该可以让我在不需要 findViewById 的情况下使用活动的视图。

实际上,只需在我的导入中添加这一行就可以很好地工作:

import kotlinx.android.synthetic.main.<layout>.*

问题是当两个不同的布局包含一个具有相同 ID 的小部件时(即合成的名称相同 属性),
例如两个不同的 TextView,ID 为 txtTitle。假设第一个在 activity 上,第二个属于适配器内部使用的布局。

当我尝试在第一个 TextView(activity 的那个)上调用方法时,我看不到预期的结果,就好像调用是在另一个视图上完成的一样。作为对此的确认,当我调用 txtTitle.parent 时,我看到了 parent 和另一个 txtTitle 的兄弟姐妹,而不是预期的。

我是不是做错了什么?我发现绕过这个问题的唯一方法是在我的所有布局中使用不同的名称或继续使用 findViewById,但浪费这种语言功能会很遗憾...

kotlin documentation on imports

If there is a name clash, we can disambiguate by using as keyword to locally rename the clashing entity

因此您可以尝试导入具有不同别名的布局:

import kotlinx.android.synthetic.main.<layoutActivity>.* as lActivity
import kotlinx.android.synthetic.main.<layoutView>.* as lView

并使用带有相应限定符的文本视图:lActivity.txtTitlelView.txtTitle

您的问题的另一种可能的解决方案是只导入一个而忽略另一个,假设您需要的所有 ID 都存在于那个 ID 中。

归根结底,相似的 ID 指向同一事物,无论是从一种布局还是另一种布局导入都无关紧要。

希望对您有所帮助

你可以尝试下面的方法 TextView 在不同的布局中具有相同的 ID。

import kotlinx.android.synthetic.main.activity_main.text_hello as lActivity

import kotlinx.android.synthetic.main.extra_layout.text_hello as lView

activity_main中的TextView使用lActivity.text = "Some text",对extra_layout中的TextView使用lView.text = "Some text"