安卓中的R类是什么?

117

在AndroidStudio中,当我使用空活动(empty activity)创建一个项目时,MainActivity.java文件中会出现以下代码:

package my.company.my_proj;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

使用一个名为R的神秘类,那么这个类R有什么作用呢?

这个问题是在询问关于一个名为R的类的作用是什么。

4个回答

145

R是一个类,包含特定应用程序包中所有资源的定义。 它位于应用程序包的命名空间中。

例如,如果您在清单文件中声明您的包名称为com.foo.bar,则会生成一个R类,其中包含com.foo.bar.R中所有资源的符号。

通常有两个R类需要处理:

  1. 框架资源在android.R中;
  2. 您自己的资源,在您的命名空间中。

它被命名为R,因为代表着Resources,让人们键入更长的东西没有意义,尤其是在使用较长的符号名称时,可能会导致很多的代码换行。


16
解决所有问题后,继续书中的内容,我可以添加(来自书中):这是一个自动生成的实用类,提供项目中资源的引用。它被称为“R类”,因为它的名称是R.java。它是通过AAPT从res文件夹中定义的资源生成的。 - Android Eve
27
让人们输入更长的东西有一个重点:这被称为"clean code",并可能还没有普及到所有人。单一字母的类、扩展、变量在局部上下文中或许没问题,但从全局来看却不行。像这样丑陋的命名会导致出现冗余的问题。 - brainray

23

什么是R: R并不是什么神秘的东西,它只是一个具有许多静态子类的类,在eclipse中打开它(在gen/目录下)看一下即可。

该类的每个成员都是以下两种情况之一:1)静态final类或2)静态final整数,它们相对于其类的其他成员是唯一的。

为什么它这么难懂: 很容易感到困惑,因为R是由ant自动生成的。它难以理解是因为你不应该手动“触碰”它(当然你可以,但你的更改将在重新生成时自动被删除)。此外,有时候eclipse会自动导入Android标准的R文件(如上面的答案中所讨论的)。

为什么总是第一个无法解析: R完全遵循Java类和包的规则,在导入方面没有任何特殊的地方。R将自动放置在清单文件中指定的包中。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="package.which.will.contain.R.and.probably.the.main.package.in.the.application" android:versionName="8.6.2011" android:versionCode="1">
    <uses-sdk android:minSdkVersion="13" />

要查看您的 R 文件属于哪个包,请在 Eclipse 中打开 gen/ 文件夹(包视图)。您将看到一个列出的包,它将具有您在清单中指定的名称。尝试删除它,如果所有资源都遵循正确的命名规则和所有 xml 文件都遵循正确的 xml 规则,并且在 Eclipse 中启用了 自动构建,它将会重新生成。

理解 R 文件的关键是要意识到它与其他类在同一个包中,即使它位于属于您“主”包的其他文件所在目录不同的位置。当您理解这一点并了解资源文件的语法和命名时,解决 R 相关问题就很容易了。


哦不,这非常非常非常非常非常非常非常非常非常非常非常神秘 - 无法解析符号“R”。 (16个不同的R) - AriesConnolly

5

Android中的R.java是由AAPT(Android Asset Packaging Tool)自动生成的文件,其中包含res/directory中所有资源的资源ID。 如果您在activity_main.xml文件中创建任何组件,则对应组件的ID将自动在此文件中创建。可以在活动源文件中使用此ID对组件执行任何操作。


4

R是资源的名称。您可以通过或类似的方式访问任何资源。

如果无法解析,请确保路径正确且引用的资源存在(区分大小写;包括扩展名)。

此外,令人困惑的部分(至少对我来说)是有两个不同的R。如果出现了很多“无法解析”的错误,请尝试查看您正在导入的内容。尝试更改或删除它。或者您可以尝试清理项目(警告:有时这会使情况比原来更糟)。


是的,清理我的项目似乎成为了每日例行公事——eclipse总是出错并且遗忘一些东西,但是彻底清理似乎可以解决问题(虽然我从未像John提到的那样经历过比现在更糟糕的情况)。 - Brian D
@Brian:当我清理我的项目时,Eclipse会销毁并重新生成我的R文件。偶尔会出现“重新生成”步骤被忽略的情况,导致我没有(或者只有一个空的)R文件,而且R文件还编程自动撤销任何手动更改。 - John
@John:你用的是什么操作系统,只是出于好奇? - Brian D
@John,清理并不能解决我的问题。你可以在这个帖子中看到实际的错误列表(目前还没有得到回答):https://dev59.com/J2445IYBdhLWcg3wTInm - Android Eve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接