2016-07-12 57 views
1

注入觀點我有一段代碼,檢查視圖是否可視Kotlinx從錯誤的佈局

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類的實例,但是科特林認爲它的一個FrameLayout。調用findViewById()在錯誤被拋出的地方,它正確返回ScrollView。我發現在不同的佈局在應用程序中有一個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

我無法重現該錯誤。你能否提供一些關於'activity_layout'和'form_component_main'位置的更多細節?也許,這些佈局是在不同的模塊? 如果你可以在一個小樣本項目中重現這種行爲,這將是非常好的。 – yanex

+0

我正在試驗同樣的問題。你解決了嗎? – Massimo

+0

不,從那以後我還沒有考慮過。 –

回答

-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

科特林合成物由一個插件的IntelliJ產生。沒有這些ID是唯一的,看起來插件目前不能正確匹配ID到正確的視圖。它可能期望唯一的ID。

+0

我最終可以這樣做,但我寧願儘可能少更改代碼,也不要引入其他問題。我沒有寫應用程序,我只是維護它。我在不同的佈局中擁有相同ID的東西不應該導致問題。 –

+0

是否在使用activity_layout的活動上顯示了form_component_main? – TTransmit

+0

它位於層次結構內部的片段中。該framgnet不是從相同的佈局誇大。 Btw ..在相同的地方調用findViewById()作爲錯誤拋出它正確返回ScrollView –