【问题标题】:Android: android.content.res.Resources$NotFoundException: String resource ID #0x5Android:android.content.res.Resources$NotFoundException:字符串资源 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 参数。

标签: android string file


【解决方案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_width="match_parent"
        android:layout_height="match_parent"
        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_width="match_parent"
            android:layout_height="45dp"
            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)
          

          【讨论】:

            猜你喜欢
            • 2013-06-27
            • 1970-01-01
            • 2021-05-09
            • 2019-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多