我有一段代码可以检查视图是否可见
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"
/>
答案 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。