Android:android.content.res.Resources$NotFoundException:字符串资源 ID #0x5
Posted
技术标签:
【中文标题】Android:android.content.res.Resources$NotFoundException:字符串资源 ID #0x5【英文标题】:Android: android.content.res.Resources$NotFoundException: String resource ID #0x5 【发布时间】:2012-06-26 17:18:07 【问题描述】:当我运行我的应用程序时,我从标题中得到了异常。它的作用是它有一个带有 Hangman 游戏单词的 .txt 文件,我认为访问该文件时会引发异常。我的文件 cuvinte.txt 位于 /assets/。这是我的代码(我跳过了 layout/xml 部分,效果很好):
public void onCreate()
// all the onCreate() stuff, then this:
try
AssetManager am = this.getAssets();
InputStream is = am.open("cuvinte.txt");
InputStreamReader inputStreamReader = new InputStreamReader(is);
BufferedReader b = new BufferedReader(inputStreamReader);
String rand;
while((rand=b.readLine())!=null)
cuvinte.add(rand);
catch (IOException e)
Toast.makeText(this, "No words file", Toast.LENGTH_LONG).show();
e.printStackTrace();
newGame(newG);
public void newGame(View view)
Random rand = new Random();
String stringCuvant = cuvinte.get(rand.nextInt(cuvinte.size()));
cuvant.setText("");
System.out.println(stringCuvant);
for(int i = 0; i< stringCuvant.length(); i++)
cuvant.append("_ ");
incercari.setText(valIncercari);
newGame() 函数在新游戏按钮被按下时和活动开始时在 onCreate() 函数中被调用。
【问题讨论】:
你应该在完成这些阅读器后关闭它们 为了专业起见,请用英文命名你的变量:) 就我而言,我遇到了这种情况,因为我试图在setText()
函数中传递一个 int 参数。
【参考方案1】:
(只是假设,Exception stacktrace的信息较少)
我认为,这一行,incercari.setText(valIncercari);
throws Exception
因为valIncercari
是int
应该是这样的,
incercari.setText(valIncercari+"");
或者
incercari.setText(Integer.toString(valIncercari));
【讨论】:
甚至更好:Integer.toString(valIncercari);
同 String.valueOf();它确实调用了 Integer.toString 和其他相应的 toString 方法
我想知道为什么 android Studio 不建议你。我在将 int 值设置为 TextView.setText 时遇到了同样的问题。
@bheatcoker - 因为setText(int)
也用于通过 id 获取字符串资源。在 Android 中,所有资源 id 都有 int
值。
String.format 是推荐的方式。 setText(String.format(Locale.US, "%d", valIncercari ));【参考方案2】:
可能导致此异常的另一种情况是使用 DataBinding, 那就是当你在你的布局中使用这样的东西时
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="model"
type="point.to.your.model"/>
</data>
<TextView
android:layout_
android:layout_
android:text="@model.someIntegerVariable"/>
</layout>
请注意,我使用的变量是一个整数,我将它分配给 TextView 的文本字段。由于 TextView 已经有一个签名为setText(int)
的方法,它将使用此方法而不是使用setText(String)
并转换值。因此,TextView 将您的输入数字视为显然无效的资源值。
解决方案是将您的 int 值转换为这样的字符串
android:text="@String.valueOf(model.someIntegerVariable)"
【讨论】:
谢谢,它有帮助。此外,您还需要在 Android Studio 中Build
-> Clean Project
重新生成数据绑定类。【参考方案3】:
只是想指出可能引发此错误的另一个原因是,如果您为应用程序的一次翻译定义了字符串资源,但未提供默认字符串资源。
问题示例:
如下所示,我有一个西班牙字符串“get_started”的字符串资源。它仍然可以在代码中引用,但如果手机不是西班牙语,则在调用getString()
时将没有资源加载和崩溃。
values-es/strings.xml
<string name="get_started">SIGUIENTE</string>
对资源的引用
textView.setText(getString(R.string.get_started)
Logcat:
06-11 11:46:37.835 7007-7007/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.app.test PID: 7007
android.content.res.Resources$NotFoundException: String resource ID #0x7f0700fd
at android.content.res.Resources.getText(Resources.java:299)
at android.content.res.Resources.getString(Resources.java:385)
at com.juvomobileinc.tigousa.ui.signin.SignInFragment$4.onClick(SignInFragment.java:188)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
问题的解决方案
防止这种情况非常简单,只需确保您始终在values/strings.xml
中有一个默认字符串资源,这样如果手机使用另一种语言,它将始终有一个可以回退的资源。
values/strings.xml
<string name="get_started">Get Started</string>
values-en/strings.xml
<string name="get_started">Get Started</string>
values-es/strings.xml
<string name="get_started">Siguiente</string>
values-de/strings.xml
<string name="get_started">ioslegen</string>
【讨论】:
当我将资源从一个 Android Studio 项目复制到另一个项目并复制 strings.xml 文件时,这一点很成功。由于一些缓存/重新加载/无论它丢弃新文件并保留旧文件。所以我有来自翻译的字符串 id,但没有来自普通的 string.xml【参考方案4】:这个问题多半是setText()
方法出错
解决方案很简单,将您的 Integer
值转换为 string
类型
作为
textview.setText(Integer.toString(integer_value));
【讨论】:
【参考方案5】:有时发生这种情况是因为不喜欢任何来源,比如如果我想从适配器将文本设置到文本视图中,那么我应该使用
textView.setText(""+name);
如果你写类似
textView.setText(name);
这将不起作用,有时我们无法从 string.xml 文件中找到资源,然后会发生这种类型的错误。
【讨论】:
【参考方案6】:有时我们在 dimen 或任何其他资源文件夹中添加资源,我们忘记添加 dp。
<dimen name="exercise_value">4</dimen>
例如,我遇到了这个问题,因为我忘记在我的值中添加 dp。 然后我把它改成了
<dimen name="exercise_value">4dp</dimen> <br>
轰隆隆。错误消失了。
【讨论】:
【参考方案7】:使用 DataBinding 并将背景设置为 EditText
以及可绘制文件夹中的资源会导致异常。
<EditText
android:background="@drawable/rectangle"
android:imeOptions="flagNoExtractUi"
android:layout_
android:layout_
android:hint="Enter Your Name"
android:gravity="center"
android:textColorHint="@color/hintColor"
android:singleLine="true"
android:id="@+id/etName"
android:inputType="textCapWords"
android:text="@=viewModel.model.name"
android:fontFamily="@font/avenir_roman" />
解决方案
我只是把背景从android:background="@drawable/rectangle"
改成android:background="@null"
清理并重建项目。
【讨论】:
【参考方案8】:您正在为文本字段分配一个数值。您必须将数值转换为字符串:
String.valueOf(variable)
【讨论】:
以上是关于Android:android.content.res.Resources$NotFoundException:字符串资源 ID #0x5的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )