库项目看起来很好,但是一旦我将它导入我的主项目,它就会显示每行引用资源的错误:
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。还有一些其他差异,例如副本使用额外的“最终”作为其定义。
我真的不知道为什么会发生这种情况。有人?
答案 0 :(得分:5)
Eclipse有时会喜欢导入android.R,这会导致与您遇到的类似的错误。
在文件顶部查找导入,然后将其删除。
如“Using Eclipse | Android Open Source”所述:
注意:Eclipse有时会喜欢在使用资源的文件顶部添加导入android.R语句,尤其是当您要求eclipse对排序或以其他方式管理导入时。这会导致你的品牌破产。注意这些错误的import语句并删除它们。
答案 1 :(得分:2)
检查资源是否在res文件夹中。所有资源都必须在里面。
也许您将数据放在项目文件夹中。
答案 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 在多个项目中定义并将与资源合并 来自应用程序或优先级最高的库。