Android:android.content.res.Resources $ NotFoundException:字符串资源ID#0x5

Flo*_*ncu 135 string android file

当我运行我的应用程序时,我从标题中获得了异常.它的作用是它有一个带有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);
}
Run Code Online (Sandbox Code Playgroud)

在按下新游戏按钮时和在活动开始时,在onCreate()函数中调用newGame()函数.

use*_*305 494

(只是假设,Exception stacktrace的更少信息)

我想,这行,incercari.setText(valIncercari);因为valIncercari是抛出异常int

应该如此,

incercari.setText(valIncercari+"");
Run Code Online (Sandbox Code Playgroud)

要么

incercari.setText(Integer.toString(valIncercari));
Run Code Online (Sandbox Code Playgroud)

  • 甚至更好:`Integer.toString(valIncercari);` (13认同)
  • 与String.valueOf()相同; 它调用Integer.toString和其他各自的toString方法 (5认同)
  • 我想知道为什么Android Studio不建议您。我在将int值设置为TextView.setText时遇到了相同的错误。 (2认同)
  • @bheatcoker - 因为 `setText(int)` 也用于通过 id 获取字符串资源。在 Android 中,所有资源 id 都有 `int` 值。 (2认同)

Dav*_*ker 13

只是想指出可以引发此错误的另一个原因是,如果为应用程序的一个转换定义了字符串资源但未提供默认字符串资源.

问题示例:

如下所示,我有一个西班牙语字符串"get_started"的字符串资源.它仍然可以在代码中引用,但如果手机不是西班牙语,它将没有资源加载并在调用时崩溃getString().

值-ES/strings.xml中

<string name="get_started">SIGUIENTE</string>
Run Code Online (Sandbox Code Playgroud)

参考资源

textView.setText(getString(R.string.get_started)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

问题的解决方案

防止这种情况非常简单,只需确保您始终拥有默认的字符串资源,values/strings.xml这样如果手机使用的是另一种语言,它将始终拥有可以回退的资源.

值/ strings.xml中

<string name="get_started">Get Started</string>
Run Code Online (Sandbox Code Playgroud)

值恩/ strings.xml中

<string name="get_started">Get Started</string>
Run Code Online (Sandbox Code Playgroud)

值-ES/strings.xml中

<string name="get_started">Siguiente</string>
Run Code Online (Sandbox Code Playgroud)

值-DE/strings.xml中

<string name="get_started">Ioslegen</string>
Run Code Online (Sandbox Code Playgroud)


Kay*_*n N 11

另一种可能导致此异常的情况是使用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>
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的变量是一个整数,我将它分配给TextView的文本字段.由于TextView已经有一个带签名的方法,setText(int)因此将使用此方法而不是使用setText(String)和转换值.因此,TextView将您的输入编号视为资源值,显然无效.

解决方案是将int值转换为这样的字符串

android:text="@{String.valueOf(model.someIntegerVariable)}"
Run Code Online (Sandbox Code Playgroud)


Suy*_*yog 5

发生此问题主要是由于setText()方法错误

解决方案很简单,将您的Integer价值转换string

textview.setText(Integer.toString(integer_value));
Run Code Online (Sandbox Code Playgroud)