作为一个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文件的编译,所以还是应该严格遵循先声明后执行的原则的。