天天看点

android相对布局中@id和@+id的区别(原理)

@id和@+id的区别,网上讲的主要是@id是引用已经存在的控件,而@+id则是声明一个新的id。

但是在相对布局中,​​

​layout_below="@id/xxx"​

​​和 ​

​layout_below="@+id/xxx"​

​似乎在显示上没什么区别,而事实上是存在细微不同的。

用一个例子来讲

<View
    android:layout_below="@+id/view1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

<View
    android:id="@id/view1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>      

上述代码是正确的,即下面的顺序是被允许的。但是去掉第一行的+号,或者将第二行与第一行的位置换一下,便不行!!!

android:layout_below="@+id/view1"
android:id="@id/view1"      

原理就是:

@+id会在R.java file里面添加一个新的id,这也就是能用​​

​findViewById(R.id.xxx)​

​找到控件的原因,而@id就直接在这个文件里查找了。

而为什么已经存在了某个id,在layout_below里仍可以@+id呢?

因为android能容忍重复的id存在,并不是说会出现两个相同的id,而是新的id覆盖原有的id,而在这儿@+id不过是将id重复创建了一遍。