Android: Android.content.res. Resources $NotFoundException: String resource ID # 0x5

当我运行我的应用程序时,我从标题中得到了异常。它的作用是。Txt 文件的文字为一个 Hangman 游戏,我认为异常是抛出时访问文件。我的文件 cuvinte.txt 位于/asset/。下面是我的代码(我跳过了布局/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 ()函数中都被调用。

176006 次浏览

(只是假设,少的异常堆栈跟踪信息)

我认为,这一行,incercari.setText(valIncercari);抛出例外 因为 valIncercari就是 int

应该是这样,

incercari.setText(valIncercari+"");

或者

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

只是想指出另一个原因,这个错误可以抛出的是,如果你定义了一个字符串资源,你的应用程序的一个翻译,但没有提供一个默认的字符串资源。

问题的例子:

正如您在下面看到的,我有一个西班牙语字符串“ get _ start”的字符串资源。它仍然可以在代码中引用,但如果电话不是西班牙语,它将没有资源加载和崩溃时,呼叫 getString()

Value-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中始终有一个默认的字符串资源,这样,如果手机使用的是另一种语言,它总是有一个可以回退的资源。

Value/strings.xml

<string name="get_started">Get Started</string>

Value-en/strings.xml

<string name="get_started">Get Started</string>

Value-es/strings.xml

<string name="get_started">Siguiente</string>

Value-de/strings.xml

<string name="get_started">Ioslegen</string>

另一个可能导致此异常的场景是使用 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)}"

这个问题主要是由于 setText()方法的误差造成的

解决方案很简单,把你的 Integer值转换成 string类型 作为

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

有时这种情况发生,因为不喜欢任何来源,如果我想设置一个文本到一个文本视图从适配器然后我应该使用

 textView.setText(""+name);

如果你写一些像

 textView.setText(name);

这不会起作用,有时候我们找不到来自 string.xml 文件的资源,那么就会出现这种类型的错误。

使用 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"

项目清理与重建。

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

String.valueOf(variable)

有时我们添加资源在 dimen 或任何其他追索文件夹,我们忘记添加 dp。

<dimen name="exercise_value">4</dimen>

例如,我正面临这个问题,因为我忘记在我的值中加入 dp。
然后我把它改成了 < br >

<dimen name="exercise_value">4dp</dimen> <br>

错误消失了。

为了解决这个问题,我不得不更换:

Toast.makeText(this, my_int_var, Toast.LENGTH_SHORT).show();

用这个:

Toast.makeText(this, String.valueOf(my_int_var), Toast.LENGTH_SHORT).show();