您的位置:首页 > 移动开发 > Android开发

安卓中@id与@+id的区别与实际应用中的@id报错问题

2016-04-11 01:10 302 查看
在安卓中,由于R.java文件的存在,各种控件设置的id在其中都是唯一的。

@+id 看样子就知道是干嘛的,为一个控件设id并加到R.java中。那么当@+id/使用了两次以上,由于id在R.java中定义为final的常量,是不会生成俩的。第二次及以后弄的不管用。

即@+id/ 的准确来说是召唤此id。如果此id不存在,创建它;如果已存在,则仅仅召唤它。

@id/ 仅召唤id,而不会创建id。

实际使用过程,则会出现@id/ 的错误:

<TextView
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"
/>

<TextView
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/更好用些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android