【问题标题】:android library project: R.id cannot be resolved or is not a fieldandroid 库项目:R.id 无法解析或不是字段
【发布时间】:2012-01-26 23:19:01
【问题描述】:

库项目看起来不错,但是一旦我将它导入到我的主项目中,它就会在引用资源的每一行上显示错误:

id 无法解析或不是字段

主项目没有显示错误。

当然,我问自己,android 知道从哪里导入资源,例如从哪里导入资源。在这样的行中:

RelativeLayout menuLayout = (RelativeLayout) this.findViewById(R.id.menu_layout);

但这两个都不起作用:

RelativeLayout menuLayout = (RelativeLayout) this.findViewById(net.bla.library.R.id.menu_layout);

有什么想法吗?

编辑:我发现的是:

只要我包含库项目,Eclipse 就会将库中的 gen/net.mylibrary.R 复制到主应用程序中(因此现在 gen 文件夹中有 2 个包:来自应用程序的包和复制的包一个来自图书馆)。奇怪的是:副本中没有找到R.id。还有一些其他的区别,比如副本使用了一个额外的“final”来定义它。

我真的不知道为什么会发生这种情况。有人吗?

【问题讨论】:

  • @SteveC as net.bla.library.R 至少当我将鼠标悬停在“R”上时,日食就是这样说的。哦,刚刚发现:不知何故,eclipse也在主项目“gen”目录中创建了一个“library”目录,所以库“R”被主应用程序“R”否决了。噗,难以形容。不幸的是,当我尝试删除“库”目录时,eclipse 立即重新生成它:/
  • jar文件是否添加在Java/Build Path/User Libraries中?
  • @SteveC 是的,将库项目添加到构建路径。这并没有改变任何东西。对库的所有依赖项都起作用,只是资源的东西不起作用。我截图了。注意主项目中的两个(!)“gen”路径:postimage.org/image/oxmt18hi9
  • 忽略我。我不熟悉 Android,所以不知道 R 是一个标准库。

标签: android dependencies


【解决方案1】:

Eclipse 有时喜欢导入 android.R,这会导致与您遇到的类似错误。

在文件顶部查找导入,然后将其删除。

正如“Using Eclipse | Android Open Source”中所述:

注意:Eclipse 有时喜欢在使用资源的文件顶部添加 import android.R 语句,尤其是当您要求 eclipse 排序或以其他方式管理导入时。这将导致您的制造中断。注意这些错误的导入语句并删除它们。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,我设法解决了它。 这是我所做的: 当我调用我的库项目的主要活动时,活动的 onCreate 方法调用 setContentView 方法并使用 R.layout.main 作为参数。

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);        
    
        setContentView(R.layout.main);
        Button btn = (Button) findViewById(R.id.main_button1);
        btn.setOnClickListener(this);
    

    findViewById 返回 null。 似乎库项目的 main.xml 被主项目的 main.xml 覆盖。 所以我简单地创建了一个新的 xml 布局 main_libname.xml,其内容与库的 main.xml 相同,并将此布局用作 setContentView 的参数。 它确实有效!

    【讨论】:

      【解决方案3】:

      检查资源是否在 res 文件夹中。所有资源都必须在里面。

      • 0 项目
        • 0.1 源代码
        • 0.2 分辨率
          • 0.2.1 布局
            • 0.2.1.1 main.xml
            • 0.2.1.2 menu_layout.xml
          • 0.2.2 可绘制对象 .....

      也许您将数据放在项目文件夹中。

      【讨论】:

      【解决方案4】:

      在库项目中定义的 R.id 项上,我也遇到了“找不到符号变量...”错误。值得注意的是,尽管其他 R 字段(例如 R.layout)清晰可见,但只有 R.id 符号在主项目中无法解析。

      幸运的是,我偶然发现了一个解决方案。事实证明,就我而言,我在主项目中定义了一个资源(布局文件),它与库项目中的名称完全相同。

      这就是文件系统的样子:

      top_level_project
          main_android_proj
              src
                  main
                      res
                          layout
                              activity_main.xml
          android_library_subproject
              src
                  main
                      res
                          layout
                              activity_main.xml
      

      我的子项目的 activity_main.xml 有一个像这样的 id:

      <RelativeLayout....>
          <TextView android:id="@+id/special_text" ... />
      </RelativeLayout>
      

      这就是我尝试在我的主项目的 java 代码中引用 id 的方式:

      MainActivity.java:
      
          public void onCreate() {
               setContentView(R.layout.activity_main);
               TextView tv = (TextView) findViewById(R.id.special_text);
               tv.setText("Hello Android");
          }
      

      为了解决这个问题,我将主项目中的有问题的文件重命名为其他文件。

      您的资源中似乎不能有重复的布局名称。 事实上,sdk docs 确实指出在使用库项目时应该小心资源名称冲突:

      • 资源冲突

      由于工具合并了图书馆的资源 项目与依赖应用程序项目的项目,给定的 可能在两个项目中都定义了资源 ID。在这种情况下,工具 从应用程序中选择资源,或者选择最高的库 优先,并丢弃其他资源。当你开发你的 应用程序,请注意公共资源 ID 可能是 在多个项目中定义并将与资源合并 优先来自应用程序或最高优先级的库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-04
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多