在安卓中,由于R.java文件的存在,各种控件设置的id在其中都是唯一的。
@+id 看样子就知道是干嘛的,为一个控件设id并加到R.java中。那么当@+id/使用了两次以上,由于id在R.java中定义为final的常量,是不会生成俩的。第二次及以后弄的不管用。
即@+id/ 的准确来说是召唤此id。如果此id不存在,创建它;如果已存在,则仅仅召唤它。
@id/ 仅召唤id,而不会创建id。
实际使用过程,则会出现@id/ 的错误:
android:id="@+id/tv_test1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/tv_test2"
android:text="bookmarkCount"
android:textSize="12sp"
/>
android:id="@+id/tv_test2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="absolute"
android:textSize="12sp"
/>
此行报错:android:layout_above=”@id/tv_test2”
原因正是@id/ 仅仅是召唤id,而不会创建id。
view在xml中定义,而安卓必须将xml文件解析,才能够生成相应的视图和相关常量如id。
安卓从上到下顺序解析或者说顺序创建视图。第一个TextView首先加载完成,而第二个TextView还未加载,此时@id/tv_test2当然是召唤不出id的,因为id根本还没有生成。@id也就无从谈起。
更改为:android:layout_above=”@+id/tv_test2”
安卓将会增加一个id到R.java文件中,于是顺利通过。而第二个TextView 在id处再次使用了 “@+id/tv_test2”,将不会重复创建。
总结是:
@id/的使用比较苛刻,主要是view的xml代码谁先写和谁后写的问题,写在前面的view,无法使用@id/ 召唤写在后面的view。
于是,如果你使用了@id/ 的写法,可能将无法调换view与view的xm代码块之间的顺序(移动的原因往往是为了使代码遵循习惯,易于读懂),否则可能报错,即使不当场报错,也会在清理项目或调试时报错。
而在布局中常用来设置一个View在……之上,在……之下,对齐……左边,对齐……右边等属性。使用@+id/将没有此烦恼
因此,个人认为@+id/更好用些。