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


158

我在运行应用程序时从标题中获得了例外。它的作用是有一个.txt文件,其中包含适用于“ Hangman”游戏的单词,我认为访问该文件时会抛出异常。我的文件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);
}

按下新游戏按钮时以及活动开始时,都会在onCreate()函数中调用newGame()函数。


使用

1
为了专业起见,请用英语命名您的变量:)
Matei Suica

1
就我而言,我遇到了这种情况,因为我试图在setText()函数内部传递int参数。
塔斯林·奥塞尼

Answers:


548

(仅假设,较少的Exception stacktrace信息)

我认为,这条线,incercari.setText(valIncercari);抛出异常,因为valIncercariint

应该是这样

incercari.setText(valIncercari+"");

要么

incercari.setText(Integer.toString(valIncercari));

15
甚至更好:Integer.toString(valIncercari);
Jave

6
与String.valueOf()相同;确实会调用Integer.toString和其他相应的toString方法
Jan Rabe

4
我想知道为什么Android Studio不建议您。我在将一个int值设置为TextView.setText时遇到了相同的错误。
bheatcoker '16

2
@bheatcoker-因为setText(int)还用于通过ID获取字符串资源。在Android中,所有资源ID都具有int价值。
user370305 '16

1
建议使用String.format。setText(String.format(Locale.US,“%d”,valIncercari));
杰弗里

15

只是想指出引发此错误的另一个原因是,如果您为应用程序的一种翻译定义了字符串资源,但未提供默认字符串资源。

问题示例:

如下所示,我有一个用于西班牙语字符串“ 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-zh-CN / 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
denispyr

14

可能导致此异常的另一种情况是使用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>

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

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

android:text="@{String.valueOf(model.someIntegerVariable)}"

谢谢,它有所帮助。另外,之后,您需要Build-> Clean Project在Android Studio中重新生成数据绑定类。
Yamashiro Rion

9

此问题主要是由于setText()方法错误引起的

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

textview.setText(Integer.toString(integer_value));

1

有时这是由于不喜欢任何来源而发生的,例如如果我想将文本设置为适配器的文本视图,那么我应该使用

 textView.setText(""+name);

如果你写类似

 textView.setText(name);

这将无法正常工作,有时我们无法从string.xml文件中找到资源,然后会发生这种类型的错误。


0

使用DataBinding并将背景设置为带有来自drawable文件夹中资源的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"

清理并重建项目。


-1

您正在为文本字段分配一个数值。您必须使用以下方法将数值转换为字符串:

String.valueOf(variable)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.