android 中Xml里面的id重名问题

声明:转载请注明原作地址。


今天在做项目的时候,居然发现@+id 居然可以重名,而且程序还不会报错。郁闷了,这到底怎么回事呢?经过google 和百度之后,才有所了解。

情况一:同个一个Xml文件中的同名

在同个一个Xml文件的中若同名了,则前一个有效,而后一个无效,即后一个Null掉。如:

    <Button        android:id="@+id/button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_above="@+id/textView1"        android:layout_alignRight="@+id/textView1"        android:layout_marginBottom="58dp"        android:layout_marginRight="18dp"        android:text="Button1" />    <Button        android:id="@+id/button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignRight="@+id/button"        android:layout_centerVertical="true"        android:text="Button2" />


前一个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是无效的,也就是说在容器控件中的子控件是不允许重名的,而不在同一容器控件中的两个控件重名也无所谓。

更多相关文章

  1. 用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)
  2. Android:为控件绑定监听器
  3. Android:控件布局(相对布局)RelativeLayout
  4. 使用ViewFlipper来组织控件
  5. 使用android上传文件
  6. Android:Resources资源文件
  7. Android手机开发 控件 TextView文字居中
  8. Android 很酷的天气动画控件
  9. Android Studio 之 AndroidManifest.xml文件中的android:label属

随机推荐

  1. android WebView总结
  2. Android(安卓)CTS的使用
  3. Android加载大图Bitmap发生OOM(Out Of Mem
  4. Android笔记-2
  5. Android中利用GridView实现水平和垂直均
  6. Android(安卓)修改横屏角度为顺时针270度
  7. Android启动流程分析(十) action的执行和
  8. 【Android】注解框架(三)-- 编译时注解,手写
  9. [Android]Android(安卓)Studio获取开发版
  10. android:shape的使用