Android: android.content.res.Resources $ NotFoundException: ID de recurso de cadena # 0x5

158

Recibo la excepción del título cuando ejecuto mi aplicación. Lo que hace es que tiene un archivo .txt con palabras para un juego de Hangman y creo que la excepción se produce al acceder al archivo. Mi archivo, cuvinte.txt se encuentra en / assets /. Aquí está mi código (omití la parte de diseño / xml, que funciona bien):

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);
}

La función newGame () se llama tanto cuando se presiona el botón del nuevo juego como al comienzo de la actividad, en la función onCreate ().

FloIancu
fuente
deberías cerrar esos lectores una vez que hayas terminado con ellos
Gubatron
1
En aras de la profesionalidad, nombre sus variables en inglés :)
Matei Suica
1
En mi caso, experimenté esto porque estaba tratando de pasar un parámetro int dentro de una setText()función.
Taslim Oseni

Respuestas:

548

(Solo suposición, menos información de Exception stacktrace)

Creo que esta línea incercari.setText(valIncercari);arroja Excepción porque valIncercariesint

Entonces debería ser,

incercari.setText(valIncercari+"");

O

incercari.setText(Integer.toString(valIncercari));
usuario370305
fuente
15
o incluso mejor:Integer.toString(valIncercari);
Jave
66
igual que String.valueOf (); que llama a Integer.toString y otros métodos toString respectivos
Jan Rabe
44
Me pregunto por qué Android Studio no te aconseja. Tuve el mismo problema al configurar un valor int en TextView.setText por error.
bheatcoker
2
@bheatcoker: porque setText(int)también se usa para obtener recursos de cadena por id. Y en Android toda la identificación de recursos tiene intvalor.
user370305
1
String.format es la forma recomendada. setText (String.format (Locale.US, "% d", valIncercari));
Jeffrey
15

Solo quería señalar otra razón por la que se puede generar este error si definió un recurso de cadena para una traducción de su aplicación pero no proporcionó un recurso de cadena predeterminado.

Ejemplo del problema:

Como puede ver a continuación, tenía un recurso de cadena para una cadena en español "get_started". Todavía se puede hacer referencia en el código, pero si el teléfono no está en español, no tendrá recursos para cargar y bloquearse al llamar getString().

values-es / strings.xml

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

Referencia al recurso

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)

Solución al problema

Prevenir esto es bastante simple, solo asegúrese de tener siempre un recurso de cadena predeterminado values/strings.xmlpara que si el teléfono está en otro idioma, siempre tendrá un recurso al que recurrir.

valores / cadenas.xml

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

values-es / 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>
David Argyle Thacker
fuente
Éste golpeó cuando copié recursos de un proyecto de Android Studio a otro y copié el archivo strings.xml. Debido al almacenamiento en caché / recarga / lo que sea, descartó el nuevo archivo y mantuvo el antiguo. Así que obtuve los identificadores de cadena de la traducción pero no del string.xml simple
denispyr
14

Otro escenario que puede causar esta excepción es con DataBinding, es decir, cuando usa algo como esto en su diseño

<?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>

Observe que la variable que estoy usando es un número entero y lo estoy asignando al campo de texto de TextView. Como TextView ya tiene un método con firma setText(int), usará este método en lugar de usar elsetText(String) y el valor. Por lo tanto, TextView piensa en su número de entrada como un valor de recurso que obviamente no es válido.

La solución es convertir su valor int a una cadena como esta

android:text="@{String.valueOf(model.someIntegerVariable)}"
Kayvan N
fuente
Gracias, me ayudó. Además, después de eso necesita Build-> Clean Projecten Android Studio para volver a generar clases de enlace de datos.
Yamashiro Rion
9

Este problema ocurre principalmente debido al error en el setText()método

La solución es simple pon tu Integervalor convirtiéndolo en stringtipo como

textview.setText(Integer.toString(integer_value));
Suyog
fuente
1

En algún momento esto sucedió debido a que no me gustaba ninguna fuente, como si quisiera configurar un texto en una vista de texto desde el adaptador, entonces debería usar

 textView.setText(""+name);

Si escribes algo como

 textView.setText(name);

esto no funcionará y, en algún momento, no encontramos el recurso del archivo string.xml y se produce este tipo de error.

pavel
fuente
0

El uso de DataBinding y la configuración del fondo del texto de edición con recursos de la carpeta dibujable provoca la excepción.

<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"/>

Solución

Solo cambio el fondo de android:background="@drawable/rectangle" a android:background="@null"

Limpiar y reconstruir el proyecto.

Tandoh Anthony Nwi-Ackah
fuente
-1

Está asignando un valor numérico a un campo de texto. Debe convertir el valor numérico en una cadena con:

String.valueOf(variable)
gdois
fuente