Android: android.content.res.Resources$NotFoundException: String resource ID #0x5
Just wanted to point out another reason this error can be thrown is if you defined a string resource for one translation of your app but did not provide a default string resource.
Example of the Issue:
As you can see below, I had a string resource for a Spanish string "get_started". It can still be referenced in code, but if the phone is not in Spanish it will have no resource to load and crash when calling getString()
.
values-es/strings.xml
<string name="get_started">SIGUIENTE</string>
Reference to resource
textView.setText(getString(R.string.get_started)
Logcat:
06-11 11:46:37.835 7007-7007/? E/AndroidRuntime﹕ FATAL EXCEPTION: mainProcess: com.app.test PID: 7007android.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)
Solution to the Issue
Preventing this is quite simple, just make sure that you always have a default string resource in values/strings.xml
so that if the phone is in another language it will always have a resource to fall back to.
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>
Another scenario that can cause this exception is with DataBinding,that is when you use something like this in your layout
<?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>
Notice that the variable I'm using is an Integer and I'm assigning it to the text field of the TextView. Since the TextView already has a method with signature of setText(int)
it will use this method instead of using the setText(String)
and cast the value. Thus the TextView thinks of your input number as a resource value which obviously is not valid.
Solution is to cast your int value to string like this
android:text="@{String.valueOf(model.someIntegerVariable)}"