android库项目:R.id无法解析或不是字段

时间:2011-12-23 17:05:36

标签: android dependencies

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

  

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。还有一些其他差异,例如副本使用额外的“最终”作为其定义。

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

4 个答案:

答案 0 :(得分:5)

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

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

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

  

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

答案 1 :(得分:2)

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

  • 0 Proyect
    • 0.1 src
    • 0.2 res
      • 0.2.1布局
        • 0.2.1.1 main.xml
        • 0.2.1.2 menu_layout.xml
      • 0.2.2 drawables .....

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

答案 2 :(得分: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 :(得分:0)

我还有#34;找不到符号变量......"库项目中定义的R.id项上的错误。值得注意的是,只有R.id符号在主项目中无法解析,即使其他R字段(例如R.layout)清晰可见。

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

这就像文件系统一样:

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   在多个项目中定义并将与资源合并   来自应用程序或优先级最高的库。