7

我是 Kotlin 的新手。在其他非常有趣的事情中,我发现了 Android 扩展,根据文档,它应该让我使用活动的视图而不需要findViewById.

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

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

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

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

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

4

3 回答 3

6

关于进口的kotlin 文档

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

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

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

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

于 2017-01-24T08:51:29.887 回答
3

您可以尝试以下操作,以TextView获得来自不同布局的相同 ID。

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"for TextViewfromactivity_mainlView.text = "Some text"for TextViewfrom extra_layout

于 2017-06-07T09:27:53.650 回答
0

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

归根结底,相似的 ID 指向同一个东西,它是从一个布局导入还是从另一个布局导入并不重要。

希望有帮助

于 2017-05-14T10:09:26.340 回答