Kotlin的合成属性发生冲突

时间:2017-01-23 15:43:31

标签: android kotlin kotlin-android-extensions

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

实际上,通过在我的导入中添加这一行,它可以很好地工作:

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

问题是两个不同的布局包含具有相同id的窗口小部件(即合成属性的名称相同),
例如标识为TextView的两个txtTitletxtTitle.parent。假设第一个属于活动,第二个属于适配器内部使用的布局。

当我尝试在第一个TextView(活动的一个)上调用一个方法时,我看不到预期的结果,就像调用将在另一个视图上完成一样。作为对此的确认,当我致电txtTitle时,我会看到另一个findViewById的父母和兄弟姐妹而不是预期的兄弟姐妹。

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

3 个答案:

答案 0 :(得分:7)

kotlin documentation on imports

  

如果存在名称冲突,我们可以使用as关键字在本地重命名冲突实体来消除歧义

因此,您可以尝试使用不同的别名导入布局:

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

并将textviews与相应的限定符一起使用:lActivity.txtTitlelView.txtTitle

答案 1 :(得分:3)

您可以尝试使用不同布局中具有相同ID的TextView以下内容。

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

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

使用lActivity.text = "Some text" TextView来自activity_mainlView.text = "Some text"来自TextView来自extra_layout

答案 2 :(得分:0)

您的问题的另一个可能的解决方案是只导入一个并省略另一个,假设您需要的所有ID都存在。

在一天结束时,类似的ID指向相同的内容,无论是从一个布局还是另一个布局导入都无关紧要。

希望有所帮助