R文件文件名为R.java,所在目录为:
app/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/com/example/xxx(此处为你的Android程序名)/R.java
但并非所有的都是这个目录
app/build/generated/source/r/arm/debug/com.example.dfanghu.xxx(程序名)/R.java,
app-->build-->generated-->source-->r-->debug,在debug下的两个选项的子文件中分别有一个R文件,
app/build/generated/source/r/androidTest/debug/com.example.administrator.xxx(程序名)/R.java,等都是有可能的,这是我在网上找的一些文件路径。
R文件是自动生成的,它会自动收录当前应用中所有的资源并根据这些资源建立对应的ID,包括:布局资源、控件资源、String资源、Drawable资源等。我们可以简单的把R.java理解成是当前Android应用的资源字典。
在当前项目不能包含任何错误的前提下,手动删除了R.java文件,编译器会立即重新生成一个R.java文件;在res/目录中增加了一个新的资源,编译器也会立即把这个资源的ID收录到R.java文件中。,但是都是有个前提的,就是当前项目不能包含任何错误。当发现在更新的资源后,R.java没有对此资源进行收录,那么就需要检查一下当前项目是否存在错误。
R文件是由一个个静态内部类组成,如图
这是其中一个类展开后的内容
R.java 文件中默认有attr、drawable、layout、string等色哥静态内部类,每个静态内部类分别对应着一种资源,如layout静态内部类对应着layout中的接界面文件,其中每个静态内部类中的静态常量分别定义为一条资源标识符。
如最后一行的:
对应的是layout文件夹中的activity_main.xml文件。
资源文件只能以小写字母和下划线做首字母,随后的名字中只能出现[a-z0-9_] 这些字符,否则R.java文件不会自动更新,并且eclipse会提示错误
当开发者在res/目录中任何一个子目录中添加相应类型的文件之后,ADT会在R.java文件中相应内部类中自动生成一条静态int类型的常量,对添加的文件进行索引
如果在layout目录下添加一个新界面,那么在public static final class layout 中也会添加相应的静态int常量
相反,我们再res目录下删除任何一个文件,其在R.java文件中对应的记录会被ADT自动删除
R.java文件除了自动标示资源的索引功能外,如果res目录中的某个资源在应用中没有被使用到,在该应用被编译的时候系统就不会把对应的资源编译到该应用的apk包中,节省资源
1、在java程序中应用资源
按照java的语法来引用即 R.resource_type.resource_name
注意:resource_name 不需要文件的后缀名
Android系统本身自带了很多资源可以引用,只是需要在前面加上 Android. 以申明来自Android系统,即Android.R.resource_type.resource_name
2、在xml文件中引用资源
在xml文件中一般是通过@[package:]type/name的方式获取的,其中@代表R.java类,drawable代表的是R.java中的静态内部类drawable,/icon代表静态内部类drawable中的静态属性icon
如果访问的是Android系统自带的文件,则要添加Android:,如下:
android:textColor="@android:color/red"
3、@+id/string_name”表达式
顺便说一下,在布局文件当中我们需要为一些组件添加 Id 属性作为标示,可以使
用如下的表达式“@+id/string_name”
其中“+”表示在 R.java 的名为 id 的内部类中添加一条记录。如”@+id/button”的含义是在 R.java 文件中的 id 这个静态内部类添加一条常量名为 button,该常量就是该资源的标识符。如果 id 这个静态内部类不存在,则会先生成它。
通过该方式生成的资源标识符,仍然可以以“@id/string_name”的方式引用。
通常,在添加资源或者删除引用后重新保存文件,Android Studio会准确无误的重新编译以项目。
不过,资源编译错误有时会一直存在会莫名其妙的出现。如遇这种情况,请尝试如下操作。
如果最近一次编译时未生成R.java文件,项目中资源引用的地方都会出错。通常,这是由某个布局XML文件中的拼写错误引起的。既然布局XML文件有时无法得到有效校验,拼写错误自然难以发现。修正找到的错误并重新保存XML文件,AS会生成新的R.java文件
选择Build → CleanProject菜单项。AS会重新编译整个项目,消除错误。建议经常做深度项目清理。
如果修改了build.gradle配置文件,就需要同步更新项目的不安已设置。选择File →Sync Project with Gradle File菜单项,AS会使用哪个正确的项目设置重新编译项目。这会解决Gradle配置变更带来的问题。
仔细查看Lint警告信息,没准就会有新发现
参考博客:https://blog.csdn.net/qq_34686440/article/details/88934680
https://blog.csdn.net/llp1992/article/details/40681599