【轉載】android 中Xml裏面的id重名問題

轉載自:http://blog.csdn.net/luckyjda/article/details/8548127 


今天在做項目的時候,居然發現@+id 居然可以重名,而且程序還不會報錯。鬱悶了,這到底怎麼回事呢?經過google 和百度之後,纔有所瞭解。

情況一:同個一個Xml文件中的同名

在同個一個Xml文件的中若同名了,則前一個有效,而後一個無效,即後一個Null掉。如:

[java] view plaincopy
  1. <span style="font-size:14px;"><Button  
  2.     android:id="@+id/button"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:layout_above="@+id/textView1"  
  6.     android:layout_alignRight="@+id/textView1"  
  7.     android:layout_marginBottom="58dp"  
  8.     android:layout_marginRight="18dp"  
  9.     android:text="Button1" />  
  10.   
  11. <Button  
  12.     android:id="@+id/button"  
  13.     android:layout_width="wrap_content"  
  14.     android:layout_height="wrap_content"  
  15.     android:layout_alignRight="@+id/button"  
  16.     android:layout_centerVertical="true"  
  17.     android:text="Button2" /></span>  


前一個Button有效(即 android:text="Button1" ),後一個無效。

情況二:在不同的Xml 文件中的同名

在同個一個Xml文件的中若同名了,兩者都有效的。

當android的工程越來越大。xml文件越來越多時,避免不了兩個xml文件中同樣的組件使用同樣的id名字,gen目錄下的R.java文件中,有關id的聲明都在id的class中,即public static final class id{};當兩個xml文件中同樣的組件,比如Button,有可能很多個文件中,都有id=”@+id/Button”,開始以爲在Java類中引用會重複的id造成程序的不識別。

後來偶然一次錯誤發現,只需你setContentView(R.layout.updatemyaddressbook);中的xml文件以及這個xml文件相關的xml文件中的id不重複,在類中使用findViewById(R.id.Button);時,程序是不會不識別的。

這個問題非常地容易理解:因爲在Android的框架設計中,每一個控件都隸屬於一棵控件樹,每個控件都被其父控件所管理與調配,而根控件是一個容器控件,所有的子控件都是構造在這個根控件之上,這樣並形成了一個控件樹的控件域,在這個控件域中是不允許重名的,超出了這個控件域則這些控件的ID是無效的,也就是說在容器控件中的子控件是不允許重名的,而不在同一容器控件中的兩個控件重名也無所謂。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章