Android: android.content.res.Resources $ NotFoundException: ID de ressource de chaîne # 0x5

158

J'obtiens l'exception du titre lorsque j'exécute mon application. Ce qu'il fait, c'est qu'il a un fichier .txt avec des mots pour un jeu du pendu et je pense que l'exception est levée lors de l'accès au fichier. Mon fichier, cuvinte.txt se trouve dans / assets /. Voici mon code (j'ai sauté la partie layout / xml, qui fonctionne très 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 fonction newGame () est appelée à la fois lorsque le bouton nouveau jeu est pressé et au début de l'activité, dans la fonction onCreate ().

FloIancu
la source
vous devriez fermer ces lecteurs une fois que vous en avez terminé avec eux
Gubatron
1
Par souci de professionnalisme, veuillez nommer vos variables en anglais :)
Matei Suica
1
Dans mon cas, j'ai vécu cela parce que j'essayais de passer un paramètre int à l'intérieur d'une setText()fonction.
Taslim Oseni

Réponses:

548

(Juste une hypothèse, moins d'informations sur Exception stacktrace)

Je pense que cette ligne incercari.setText(valIncercari);jette une exception parce que valIncercaric'estint

Donc ça devrait être,

incercari.setText(valIncercari+"");

Ou

incercari.setText(Integer.toString(valIncercari));
user370305
la source
15
ou encore mieux:Integer.toString(valIncercari);
Jave
6
identique à String.valueOf (); qui appelle Integer.toString et d'autres méthodes toString respectives
Jan Rabe
4
Je me demande pourquoi Android Studio ne vous conseille pas. J'ai eu le même problème en définissant une valeur int dans TextView.setText pour erreur.
bheatcoker
2
@bheatcoker - car setText(int)également utilisé pour obtenir une ressource de chaîne par identifiant. Et dans Android, tout identifiant de ressource a une intvaleur.
user370305
1
String.format est la méthode recommandée. setText (String.format (Locale.US, "% d", valIncercari));
Jeffrey
15

Je voulais simplement souligner une autre raison pour laquelle cette erreur peut être générée si vous avez défini une ressource de chaîne pour une traduction de votre application mais que vous n'avez pas fourni de ressource de chaîne par défaut.

Exemple du problème:

Comme vous pouvez le voir ci-dessous, j'avais une ressource de chaîne pour une chaîne espagnole "get_started". Il peut toujours être référencé dans le code, mais si le téléphone n'est pas en espagnol, il n'aura aucune ressource à charger et se plantera lors de l'appel getString().

valeurs-es / strings.xml

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

Référence à la ressource

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)

Solution au problème

Éviter cela est assez simple, assurez-vous simplement que vous avez toujours une ressource de chaîne par défaut values/strings.xmlafin que si le téléphone est dans une autre langue, il aura toujours une ressource vers laquelle se rabattre.

values ​​/ strings.xml

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

values-fr / strings.xml

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

valeurs-es / strings.xml

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

values-de / strings.xml

<string name="get_started">Ioslegen</string>
David Argyle Thacker
la source
Celui-ci a frappé lorsque j'ai copié des ressources d'un projet Android Studio à un autre et que j'ai copié le fichier strings.xml. En raison de la mise en cache / rechargement / quoi que ce soit, il a rejeté le nouveau fichier et conservé l'ancien. J'ai donc eu les identifiants de chaîne de la traduction mais pas de la chaîne pure.xml
denispyr
14

Un autre scénario qui peut provoquer cette exception est avec DataBinding, c'est-à-dire lorsque vous utilisez quelque chose comme ça dans votre mise en page

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

Notez que la variable que j'utilise est un entier et que je l'attribue au champ de texte du TextView. Étant donné que le TextView a déjà une méthode avec la signature, setText(int)il utilisera cette méthode au lieu d'utiliser setText(String)et de convertir la valeur. Ainsi, TextView considère votre numéro d'entrée comme une valeur de ressource qui n'est évidemment pas valide.

La solution consiste à convertir votre valeur int en une chaîne comme celle-ci

android:text="@{String.valueOf(model.someIntegerVariable)}"
Kayvan N
la source
Merci, cela a aidé. Ensuite, vous devez également Build-> Clean Projectdans Android Studio pour régénérer les classes de liaison de données.
Yamashiro Rion
9

Ce problème se produit principalement en raison de l'erreur de setText()méthode

La solution est simple mettre votre Integervaleur en convertissant en stringtype comme

textview.setText(Integer.toString(integer_value));
Suyog
la source
1

Parfois, cela s'est produit en raison de ne fonder aucune source, comme si je veux définir un texte dans une vue de texte à partir de l'adaptateur, je devrais utiliser

 textView.setText(""+name);

Si vous écrivez quelque chose comme

 textView.setText(name);

cela ne fonctionnera pas et parfois, nous ne trouvons pas la ressource dans le fichier string.xml, ce type d'erreur se produit.

Pavel
la source
0

L'utilisation de DataBinding et la définition de l'arrière-plan de l'edittext avec des ressources du dossier dessinable provoque l'exception.

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

Solution

Je change juste le fond de android:background="@drawable/rectangle"à android:background="@null"

Nettoyez et reconstruisez le projet.

Tandoh Anthony Nwi-Ackah
la source
-1

Vous affectez une valeur numérique à un champ de texte. Vous devez convertir la valeur numérique en une chaîne avec:

String.valueOf(variable)
gdois
la source