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 因为valIncercariint

应该是这样的,

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 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录