使用kotlin android扩展在不同的布局中引用具有相同id的视图

Naz*_*rke 8 android kotlin kotlin-android-extensions

在我的Android项目中,我有两个布局:num_info和num_info_pack.两者都有id"circle"的视图.所以我认为通过layout_name.circle引用这些视图可以解决问题:

val inetView = activity.layoutInflater.inflate(R.layout.num_info_pack, parent, false)
    inetView.circle.setBackgroundResource(background)
Run Code Online (Sandbox Code Playgroud)

但圆圈用红色加下划线,它说:

过载分辨率模糊.所有这些功能都匹配.

public val View.circle:查看!在kotlinx.android.synthetic.main.num_info_pack.view中定义

public val View.circle:RelativeLayout!在kotlinx.android.synthetic.main.num_info_inet_plus_pack.view中定义

如果我特意说inetView.circle,为什么我在谈论哪个圈子?

Vip*_*mar 6

这里的解决方案是进口.您必须导入两个布局,如

import kotlinx.android.synthetic.main.num_info_pack
Run Code Online (Sandbox Code Playgroud)

import kotlinx.android.synthetic.main.num_info_inet_plus_pack
Run Code Online (Sandbox Code Playgroud)

删除其中一个,并使用您要导入的相应布局文件保留一个.它应该工作正常.


Kin*_*dio 5

除了已经非常好的答案之外,如果您在项目中的多个布局中具有相同的ID,那么选择哪一个ID无关紧要。无论定义了哪种布局,相似的ID最终都指向同一视图。因此,您可以舍弃其他导入,而仅保留当前对您重要的布局activity/fragment/view

希望能有所帮助


gle*_*e8e 2

我现在手头没有 android studio,但我认为这可以解决你的问题:

package XXX

import kotlinx.android.synthetic.main.num_info_inet_plus_pack.view.circle as inetViewCircle
import kotlinx.android.synthetic.main.num_info_pack.view as circle
//...
val inetView = activity.layoutInflater.inflate(R.layout.num_info_pack, parent, false)
inetViewCircle.setBackgroundResource(background)
Run Code Online (Sandbox Code Playgroud)

不知道这是否有效,因为我现在无法测试。请让我知道它是否有效。

问题是名称冲突,所以我认为导入别名可能会有所帮助。