关于xml文件中id的声明顺序的小问题以及联想

这篇博客讲述了作者在Android开发中遇到的R文件丢失问题,原因是XML布局文件中ID的声明顺序错误。作者发现Android Studio的Design视图可能不会反映实际问题,并通过查看R.txt文件理解了ID的声明顺序对于R.java生成的影响。总结得出,应遵循先声明后使用的规则,以避免资源找不到的错误。
摘要由CSDN通过智能技术生成

作为一个android萌新,很是囫囵吞枣地看了看教程就直接开始了画界面,然后不出意外地遇到了作为新人感到最头疼的问题,R文件不见了。


在网上查到的问题和解决方法一般就是检查一下自己的xml文件是否有问题,如果没有问题就clean一下自己的project再直接rebuild。可以看到android studio中design符合预期的我默认绝对是ide自己的错(怎么可能是老夫的错呢?)然后愚蠢地不停clean,rebuild...


Error:(16, 46) No resource found that matches the given name (at 'layout_constraintBottom_toTopOf' with value '@id/password').

Error:Execution failed for task ':app:processDebugResources'.
> com.android.ide.common.process.ProcessException: Failed to execute aapt


嗯,找不到资源password,aapt没法儿正常运行。。。大概是xml文件有问题吧,看源代码。


<EditText
    android:id="@+id/username"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Input your username"
    app:layout_constraintBottom_toTopOf="@id/password"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"/>

<EditText
    android:id="@+id/password"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Input your password"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

design还是很正常两个edittext,咋就报错了。看了一下,应该是使用和声明的问题,在这里非常愚蠢地先使用后声明了,在交换了代码顺序后的确问题解决了。但是在android studio中不是每次保存文件的时候都会把@+id的对应资源保存到R.java文件中吗?应该不是每次都要重新加入这个资源吧,在使用时直接使用R.java不就好了,为什么还会有这种声明和使用的问题呢?


没查到为啥,大概是这么低级的问题除了我这种蠢萌的家伙也没人会犯。只好到处点一点,很幸运地直接找到了问题所在。


F:\AndroidStudioProjects\MyApplication\app\src\main\res\layout\content_main.xml

F:\AndroidStudioProjects\MyApplication\app\build\intermediates\res\merged\debug\layout\content_main.xml


同一个文件的错误却在不同的位置报错,好吧,麻烦的后台的问题。把正确的代码切回到错误的状态,并且build一下。然后会在package状态下的项目中R.java文件不见了,可见在build android安装包的时候R.java文件是要重新生成,然后选择下面报错的content_main.xml,jump to source,找到了所在位置,会发现连上面android的uri都报错了,有点慌,但其实没啥事儿,只是aapt没法儿正常跑产生的问题。


把项目视图切换到project,依据上面的路径找到content_main.xml,好吧,这并没有什么用。有用的是我在这个过程中找到了R.txt(而不是R.java),我在其中找到了:


int id username 0x7f0d007d

int id password 0x7f0d007c

似乎并不能证明什么,因为我不知道这个R.txt是来自R.java还是build过程中产生的,但是值得注意的是password对应的值比username小一位,正确代码中password也确实应该在username前面,所以哪怕是错误代码也可以产生正确顺序吗?会报错从侧面说明了必须先声明后使用,那么是怎么知道后声明的代码顺序是在先声明的代码之前呢?我删除了username中对password的使用,并且调换顺序,可以确认R.java文件中顺序与位置有关。所以应该在R.java中的顺序与声明调用顺序相关。而且在执行时R.java的生成应该并不早于对xml文件的编译,所以还是应该严格遵循先声明后执行的原则的。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值