Kotlinx从错误的布局中注入视图

时间:2016-07-12 21:10:37

标签: android kotlin kotlin-android-extensions

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

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。我发现应用程序中的不同布局在同一个ID 下有一个 FrameLayout

我正在按照布局进行充气

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"
    />

1 个答案:

答案 0 :(得分:0)

为什么不给他们不同的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).(来自RecyclerView Not Displaying Any CardView Items

Kotlin合成物由IntelliJ插件生成。如果ID不是唯一的,那么插件似乎无法正确地将ID与正确的视图匹配。它可能期望唯一的ID。