Android開發必知--使用View.setId的正確姿勢


  這兩天在寫一個柱狀圖的自定義控件,用的直接繼承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);

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM