【问题标题】:Kotlinx injects view from wrong layoutKotlinx 从错误的布局注入视图
【发布时间】:2016-07-12 21:10:36
【问题描述】:

我有一段代码检查视图是否可见

import kotlinx.android.synthetic.main.activity_layout.*

val isOverflowPanelShown: Boolean
   get() = overflow_panel.visibility != View.GONE

之前的代码抛出异常

java.lang.ClassCastException: android.widget.FrameLayout cannot be cast to android.widget.ScrollView
    at com.company.app.Activity.isOverflowPanelShown(Activity.kt:362)

视图是ScrollView 类的实例,但是 kotlin 认为它是FrameLayout。在引发错误的同一位置调用 findViewById() 会正确返回 ScrollView。我发现在应用程序的不同布局中有一个FrameLayout在同一id下

我正在膨胀以下布局

activity_layout

<ScrollView
    android:id="@+id/overflow_panel"
    android:layout_width="300dp"
    android:layout_height="wrap_content"
    />

在我在完全不同的地方使用的另一个布局中,有一个具有相同 id 的不同视图。

form_component_main

<FrameLayout
    android:id="@+id/overflow_panel" 
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    />

【问题讨论】:

  • 我无法重现该错误。您能否提供更多关于activity_layoutform_component_main 位于何处的详细信息?也许,这些布局在不同的模块中?如果您可以在一个小型示例项目中重现此行为,那就太好了。
  • 我正在尝试同样的问题。你解决了吗?
  • 没有,从那以后我就再也没有听说过它了。

标签: android kotlin kotlin-android-extensions


【解决方案1】:

为什么不给他们不同的ID?

overflow_panel_scroll
overflow_panel_frame

或者更能描述他们实际所做的事情。

更新:更多解释,因为这被否决了。 ID 应该是唯一的。

Android 文档说,如果 ID 不是唯一的,则可能会发生冲突:An ID need not be unique throughout the entire tree, but it should be unique within the part of the tree you are searching (which may often be the entire tree, so it's best to be completely unique when possible).(来自http://developer.android.com/guide/topics/ui/declaring-layout.html

Kotlin 合成由 IntelliJ 插件生成。如果 ID 不唯一,则插件当前似乎无法将 ID 正确匹配到正确的视图。它可能需要唯一的 ID。

【讨论】:

  • 我最终可以做到这一点,但我宁愿更改尽可能少的代码,而不是引入其他问题。我没有编写应用程序,我只是在维护它。我认为在不同的布局中具有相同的 id 应该不会造成问题。
  • form_component_main 是否曾经显示在使用 activity_layout 的活动上?
  • 它位于层次结构深处的一个片段中。 framgnet 不是从相同的布局膨胀的。顺便说一句.. 在引发错误的同一位置调用 findViewById() 会正确返回 ScrollView
  • 我对合成材料还很陌生。我不确定生成的 R.java 和合成器是如何交互的。在 R.java 中搜索 overflow_panel 可能值得(应该在 app > build > generated > source > r > ......)。它可能会获得 findViewById 可以处理但合成不能处理的多个版本。
  • 这是我在.....>source>r>debug>packageId>R.java public static final int overflow_panel=0x7f0b0085; 中找到的唯一东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 2017-03-24
相关资源
最近更新 更多