Android: android.content.res.Resources $ NotFoundException: ID risorsa stringa # 0x5


158

Ottengo l'eccezione dal titolo quando eseguo la mia app. Quello che fa è che ha un file .txt con le parole per un gioco dell'impiccato e penso che l'eccezione venga generata quando si accede al file. Il mio file, cuvinte.txt si trova in / assets /. Ecco il mio codice (ho saltato la parte layout / xml, che funziona benissimo):

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 funzione newGame () viene chiamata sia quando si preme il nuovo pulsante di gioco sia all'inizio dell'attività, nella funzione onCreate ().


dovresti chiudere quei lettori dopo aver finito con loro
Gubatron

1
Per motivi di professionalità, si prega di nominare le variabili in inglese :)
Matei Suica,

1
Nel mio caso, l'ho sperimentato perché stavo cercando di passare un parametro int all'interno di una setText()funzione.
Taslim Oseni,

Risposte:


548

(Solo ipotesi, meno informazioni di StackTrace di eccezione)

Penso che questa linea incercari.setText(valIncercari);generi Eccezione perchévalIncercari èint

Quindi dovrebbe essere

incercari.setText(valIncercari+"");

O

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

15
o meglio ancora:Integer.toString(valIncercari);
Jave,

6
uguale a String.valueOf (); che chiama Integer.toString e altri rispettivi metodiString
Jan Rabe

4
Mi chiedo perché Android Studio non ti consigli. Ho avuto lo stesso problema impostando un valore int in TextView.setText per errore.
bheatcoker

2
@bheatcoker - perché setText(int)utilizzato anche per ottenere risorse stringa dall'ID . E in Android tutti gli ID risorsa hanno intvalore.
user370305,

1
String.format è il modo consigliato. setText (String.format (Locale.US, "% d", valIncercari));
Jeffrey,

15

Volevo solo sottolineare un altro motivo per cui questo errore può essere generato se hai definito una risorsa stringa per una traduzione della tua app ma non hai fornito una risorsa stringa predefinita.

Esempio del problema:

Come puoi vedere di seguito, avevo una risorsa stringa per una stringa spagnola "get_started". Può ancora essere referenziato nel codice, ma se il telefono non è in spagnolo non avrà risorse da caricare e crash durante la chiamatagetString() .

I valori-es / strings.xml

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

Riferimento alla risorsa

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)

Soluzione al problema

Prevenire questo è abbastanza semplice, assicurati solo di avere sempre una risorsa di stringa predefinita in values/strings.xmlmodo che se il telefono è in un'altra lingua avrà sempre una risorsa a cui ricorrere.

Valori / strings.xml

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

I valori-it / strings.xml

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

I valori-es / strings.xml

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

I valori-de / strings.xml

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

Questo ha colpito quando ho copiato le risorse da un progetto Android Studio a un altro e ho copiato il file strings.xml. A causa della memorizzazione nella cache / ricaricamento / qualunque cosa abbia scartato il nuovo file e conservato quello vecchio. Quindi ho avuto gli ID stringa dalla traduzione ma non dal semplice string.xml
denispyr

14

Un altro scenario che può causare questa eccezione è con DataBinding, ovvero quando si utilizza qualcosa di simile nel 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>

Si noti che la variabile che sto utilizzando è un numero intero e la sto assegnando al campo di testo di TextView. Poiché TextView ha già un metodo con firma setText(int), utilizzerà questo metodo invece di usare setText(String)e lanciare il valore. Pertanto, TextView considera il numero di input come un valore di risorsa che ovviamente non è valido.

La soluzione è lanciare il tuo valore int su una stringa come questa

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

Grazie, mi ha aiutato. Inoltre, è necessario Build-> Clean Projectin Android Studio per rigenerare le classi di associazione dei dati.
Yamashiro Rion,

9

Questo problema si verifica principalmente a causa dell'errore nel setText()metodo

La soluzione è semplice metti il ​​tuo Integervalore convertendolo in stringtipo as

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

1

A volte questo è accaduto a causa del fatto che non mi piaceva alcuna fonte come se volessi impostare un testo in una visualizzazione di testo dall'adattatore, quindi dovrei usare

 textView.setText(""+name);

Se scrivi qualcosa del genere

 textView.setText(name);

questo non funzionerà e a volte non troviamo la risorsa dal file string.xml quindi si verifica questo tipo di errore.


0

L'uso di DataBinding e l'impostazione dello sfondo sull'edittext con risorse dalla cartella drawable provoca l'eccezione.

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

Soluzione

Ho appena cambiato lo sfondo da android:background="@drawable/rectangle" a android:background="@null"

Pulisci e ricostruisci il progetto.


-1

Stai assegnando un valore numerico a un campo di testo. Devi convertire il valore numerico in una stringa con:

String.valueOf(variable)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.