【问题标题】:Referencing views with the same id in different layouts with kotlin android extensions使用 kotlin android 扩展在不同布局中引用具有相同 id 的视图
【发布时间】:2017-05-19 04:37:53
【问题描述】:

在我的 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)

但是圆圈带有红色下划线,上面写着:

重载分辨率不明确。所有这些功能都匹配。

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,为什么会混淆我在说哪个圆圈?

【问题讨论】:

    标签: android kotlin kotlin-android-extensions


    【解决方案1】:

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

    希望有帮助

    【讨论】:

    • 真的。有人愿意分享为什么这被否决了吗? :O
    • 你说的其实是对的。您只需从其中一种布局中显式导入,无论如何它最终都会指向正确的视图。
    • @KingsleyAdio 和你说的完全一样。我刚刚从其中一种布局中导入,它想通了。我有一个采用不同布局的自定义视图。 kotlin 只需导入任何布局 id 就可以解决所有问题。非常感谢。
    • @KingsleyAdio 哈哈。第一次,我也不敢相信。如果你放一些代码或细节解释,它就会有说服力。无论如何,我为你投票。
    【解决方案2】:

    这里的解决方案是导入。您必须导入两个布局,例如

    import kotlinx.android.synthetic.main.num_info_pack
    

    import kotlinx.android.synthetic.main.num_info_inet_plus_pack
    

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

    【讨论】:

      【解决方案3】:

      我现在手头没有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)
      

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

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

      【讨论】:

      • 嘿,是的,这是我目前的解决方案,给他们不同的名字。但是这样的情况也不少。所以有这么多进口看起来并不整洁。另外,inetView 不是 kotlin 合成对象,它是一个 android 对象,所以 inetView.inetViewCircle 不起作用。 inetViewCircle.setBackground.... 有效。
      • 呃,这很有趣。我正在删除这个答案。您介意将您的解决方法添加到您的问题正文中吗?
      • 你可以留下这个答案。这是解决方法。我刚刚编辑了它,所以现在可以了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多