這兩天在寫一個柱狀圖的自定義控件,用的直接繼承ViewGroup的方式實現的,我們都知道,這是自定義控件里面最簡單的一種了,有時間寫個總結分享一下。這里我想說的重點是,在寫這個自定義控件的時候遇到了個關於View.setId()小問題,在網上查了好多,有很多回答真是純屬扯淡,最后終於在stackoverflow上找到了零零碎碎的解決方案,stackoverflow真是一個好地方,幾乎所有的問題都可以在上面找到解決方案。在此對這個問題整理記錄下來,以便參考。
其實這個問題也應該是一個開發者必須提前知道的問題,因為我們在開發中,難免需要在代碼中動態的添加View並且為其設置id,這種情況下,我們怎么避免與現有的控件id重復呢?試驗后發現,將一個int類型的數直接作為setId()的參數在AndroidStudio里面會報錯的,說警告可能更合適些,因為可以運行,而在eclipse中這樣用不會提示錯誤,也沒有警告。但別管報錯與否,這樣是不安全的,存在着控件中id沖突的隱患。
如圖:
eclipse下沒有報錯,也無警告。
AndroidStudio下報錯。
重新整理一下問題描述:在AndroidStudio中,用代碼動態添加控件時,通過View.setId(int id)為控件添加id時直接賦值一個int類型的參數會“報錯”,下面就說說View.setId()的正確使用姿勢。
·方案一:通過調用View.generateViewId()作為setId的參數,但此方案不是最佳方案,因為View.generateViewId()方法必須為SDK版本17及以上才行,否則報錯。(但也有可以通過自寫一個Utils.generateViewId()解決,不過既然有方案二更好的方法,就不過多贅述此方法了)
my_view.setId(View.generateViewId());
·方案二:在res/values/下添加ids.xml(名字可隨意)文件,代碼如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <item name="my_view" type="id" /> </resources>
然后在代碼中做如下設置即可:
my_view.setId(R.id.my_view);