Android中的R类是什么?


89

在AndroidStudio中,当我使用空活动创建项目时,我在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什么?

Answers:


117

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

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

通常您将要处理两个 R

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

它被命名R因为这代表- [R物资跟不上,并且在制作人型的东西更长的时间,特别是因为它是很常见的后相当长的符号名结束了没有意义的,这可能导致线路包装相当数量。


10
解决所有问题并继续阅读本书之后,我可以(从本书中)添加:这是一个自动生成的实用程序类,提供对项目中资源的引用。因为它的名称是R.java,所以被称为“ R类” 。它是由AAPT从res文件夹中定义的资源生成的。
Android Eve

1
什么android.R
马尔温德·辛格

13
有一点可以使人们输入更长的时间:这称为干净代码,可能还没有到达所有人。一个字母的类,扩展名,变量在局部上下文中可能很好,但在全局范围内则不行。这样的丑陋名字会导致类似这样的多余问题。
brainray

23

什么是R:R 并没有什么神秘之处。它只是一个具有许多静态子类的类,将其在eclipse中打开并进行查看(位于gen /下)。

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

为什么如此神秘: 它很容易混淆,因为R由蚂蚁自动生成。它是神秘的,因为您不应该手动“触摸”它(当然可以,但是您的更改将在重新生成时自动删除)。由于有时eclipse会自动导入androids标准R文件(如上面的答案中所述),因此它的含义还很神秘

为什么它总是第一个无法解决的问题: R严格遵循Java类和包的规则,R在导入方面的行为没有特别之处。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文件与其他类位于同一软件包中,即使它与属于您的“ main”软件包的其他文件位于不同的目录中。了解这一点并理解资源文件的语法和命名之后,使用R进行故障排除很容易。


3

R是您的资源的名称。您访问的任何资源R.$FOLDER.$RESOURCE或非常相似的资源。

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

而且,令人困惑的部分(无论如何对我而言)是有两个不同R的。 如果遇到很多“无法解决”错误,请尝试查看要导入的内容。尝试更改或删除它。或者,您可以尝试清理您的项目(警告:有时这会使事情变得比现在还糟)。


是的,清理我的项目似乎是每天的例行工作-蚀总是使人烦恼而忘了事情,但是良好的清理似乎可以解决问题(尽管正如约翰提到的,我从未经历过比现在更糟的事情) 。
Brian D

@Brian:清理项目时,Eclipse破坏并重新生成R文件。有时,它会错过“重新生成”步骤,从而使我处于无(或空着)状态,R并且R被编程为自动撤消手工所做的任何更改。
约翰,

@John:出于好奇,您正在使用什么操作系统?
Brian D

@John,对于我而言,清洁无济于事。你可以看到在这个线程错误的实际列表(尚未回答):stackoverflow.com/questions/4928784/...
安卓夏娃

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.