当Android资源明明存在但仍然出现android.content.res.Resources$NotFoundException异常时该怎么办?

111
请告诉我我哪里错了以导致出现错误。
我正在创建一个应用程序,其中有一个活动只能在横屏模式下显示。因此,我在AndroidManifest.xml文件中添加了以下内容。
<activity android:name=".LandScapeImageActivity" android:screenOrientation="landscape"></activity>

我创建了一个名为

/res/layout-land

的文件夹,并在其中添加了一个名为see_today_landscape_layout的布局。

onCreate()中,我添加了以下内容:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.see_today_landscape_layout);
....
}

但是当我运行我的应用程序时,我遇到了以下错误

02-06 13:46:14.358: E/AndroidRuntime(13286): FATAL EXCEPTION: main
02-06 13:46:14.358: E/AndroidRuntime(13286): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mid.kew.activities/com.mid.kew.activities.LandScapeImageActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x7f03002b
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4066)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.app.ActivityThread.access$2400(ActivityThread.java:135)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2140)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.os.Looper.loop(Looper.java:144)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.app.ActivityThread.main(ActivityThread.java:4937)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at java.lang.reflect.Method.invokeNative(Native Method)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at java.lang.reflect.Method.invoke(Method.java:521)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at dalvik.system.NativeStart.main(Native Method)
02-06 13:46:14.358: E/AndroidRuntime(13286): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f03002b
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.content.res.Resources.getValue(Resources.java:892)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.content.res.Resources.loadXmlResourceParser(Resources.java:1869)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.content.res.Resources.getLayout(Resources.java:731)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.view.LayoutInflater.inflate(LayoutInflater.java:318)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.app.Activity.setContentView(Activity.java:1654)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at com.mid.kew.activities.LandScapeImageActivity.onCreate(LandScapeImageActivity.java:103)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
02-06 13:46:14.358: E/AndroidRuntime(13286):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
02-06 13:46:14.358: E/AndroidRuntime(13286):    ... 12 more

我在 R.java 中核对了一下,发现它有ID为7f03002b的资源,而异常就是在寻找这个资源,且该资源确实存在于其中...

我已经尝试了5次清理并重新构建项目,但问题仍然存在。

奇怪的是,这昨天还能正常工作,而今天却不能。代码是一样的。


Resource ID #0x7f03002b 是什么?你应该提供 see_today_landscape_layout.xml 文件的内容。 - a.ch.
是的,它是根据 R.java 引用 see_today_landscape_layout.xml。 - Nik
1
可能是Android资源未找到异常?的重复问题。 - rds
当我升级使用compile 'com.android.support:appcompat-v7:23.4.0'时,我遇到了这个问题。如果我保持使用v7:22.2.0',它可以正常工作。 - tread
16个回答

239

我的情况是因为将 int 参数用于 TextView 导致的。让我举个例子。

对于我的情况,造成问题的原因是将整型参数(int)传递给了一个文本视图(TextView)。以下是一个示例:

int i = 5;
myTextView.setText(i);

获得上述错误信息。

可以通过将int转换为String来解决此问题,如下所示:

myTextView.setText(String.valueOf(i));

当你编写int时,它期望的是一个资源而不是你所编写的文本。因此,在Android中将int设置为String时要小心。


谢谢,它起作用了。我一开始尝试这样做:num2.setText(lotteryCharacters.charAt(2));,然后我改成了num2.setText(String.valueOf(lotteryCharacters.charAt(2)));……结果它成功了! - TharakaNirmana
1
我想知道valueOf(i)和"" + i之间有什么区别? - peterb
完全出乎意料,发现得好!谢谢。 - gunjot singh
1
XAML代码怎么样?我该如何设置值。我的情况是在XAML上为属性设置十进制值。 - zquanghoangz
3
谢谢,原因是setText方法是一个重载方法,可以接受String和资源ID。当你传递一个int类型的参数时,它会寻找资源ID。 - abedfar
我在将字符设置为TextView文本时遇到了相同的错误。这个方法解决了它。 - marts

38
  1. 在eclipse中,转到 项目 > 清理...
  2. 选择您的项目,然后按OK
  3. 重新启动应用程序

如果再次发生,请删除 r.java 文件。它将自动生成。


2
正如我之前提到的那样,我已经清除了 bin 和 gen 文件夹并重新构建了应用程序,但仍然无法正常工作。 - Nik
161
如果这个方法没有解决你的问题,为什么它会被标记为已解决呢? - IcedDante
2
如果在发布的应用程序中出现这种情况,你会怎么做? - Dinesh
在Intellij中对我有效。我只在发布版本中遇到了这个异常,但是在进行“Build -> Clean Project -> Restart IDE”之后,我的发布版本开始正常运行。 - chirayu joshi

14

由于您明确设置了布局,因此您可能希望尝试将其放在默认的 /layout 文件夹中,而不是 /layout-land 文件夹中,因为这只适用于如果您想要 Android 自动处理旋转的情况。


1
如果手机处于纵向视图,则它将保持纵向,当您旋转手机时,它将变为横向。您是否想让它始终处于横向?那么您需要在清单文件或代码中将活动的方向设置为横向,请参阅此问题:https://dev59.com/PHI95IYBdhLWcg3wyRM0 - mbwasi
我已经按照我在问题中提到的方式完成了这个任务 '<activity android:name=".LandScapeImageActivity" android:screenOrientation="landscape"></activity>'。 - Nik
1
你缺少了configChanges部分 <activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="abcActivty"/> - mbwasi

12

尝试将您的布局xml从res/layout-land文件夹移动到res/layout文件夹中。


放到布局文件夹里? - Robert
1
从res/layout-land文件夹复制到res/layout文件夹。 - Ashish Kumar
我也遇到过这种情况,不止一次。 - Markos Evlogimenos
我把我的xml文件从res/layout-sw600dp移动到了res/layout,然后它就可以工作了。谢谢你的回答。 - Shailendra Madda

5

我在Android 6上遇到了这个错误。将所有的drawable从drawable-v24文件夹移动到drawable文件夹中,错误最终消失了。


2

我因为另一个原因遇到了这个错误:

我有一个名为res/xml/data.xml的文件,并且我试图使用Resources类来加载它,像这样:

Resources.getSystem().getXml(R.xml.data);

然而,这是不正确的,因为方法 Resources.getSystem() 返回一个全局共享的 Resources 对象,只提供访问系统资源。

正确的方法如下(从 Activity 内部):

this.getResources().getXml(R.xml.data);

如何从不继承自Activity的顶层函数或类中访问资源? - zombiesauce

2

在我的情况下,我在旧项目的build.gradle文件中发现我的构建工具版本过时了。更新它可以解决这个问题:

android {
    ...
    buildToolsVersion "19.0.1"
    ...

已更新至最新版本的构建工具(25.0.1),同步了项目,一切正常。


2

请检查您的导入是否正确。我曾经遇到过类似的问题,其中 R 指向的是 Android 系统中的 R 文件而不是本地文件。


2

这可能是由于手机语言与您的代码不匹配所导致的。例如,您的preference.xml文件放置在xml-en目录中,而您正在尝试在选择了法语的手机上运行应用程序,则应用程序将崩溃。


始终创建默认资产文件夹,然后添加特定于语言或方向的文件夹。虽然这可能或可能不是在这里的情况 :) - Ahmad Ali Nasir

1
我删除了项目中的文件夹 build。在 Android Studio 中进行了清理和重建。然后在 build.gradle 和 AndroidManifest 中纠正了错误。

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