Android: android.content.res.Resources $ NotFoundException: String-Ressourcen-ID # 0x5


158

Ich erhalte die Ausnahme vom Titel, wenn ich meine App starte. Es hat eine TXT-Datei mit Wörtern für ein Hangman-Spiel und ich denke, die Ausnahme wird beim Zugriff auf die Datei ausgelöst. Meine Datei cuvinte.txt befindet sich in / assets /. Hier ist mein Code (ich habe den Layout / XML-Teil übersprungen, der gut funktioniert):

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

Die Funktion newGame () wird sowohl beim Drücken der neuen Spieltaste als auch zu Beginn der Aktivität in der Funktion onCreate () aufgerufen.


Sie sollten diese Leser schließen, nachdem Sie mit ihnen fertig sind
Gubatron

1
Aus Gründen der Professionalität benennen Sie bitte Ihre Variablen in Englisch :)
Matei Suica

1
In meinem Fall habe ich dies erlebt, weil ich versucht habe, einen int-Parameter innerhalb einer setText()Funktion zu übergeben.
Taslim Oseni

Antworten:


548

(Nur Annahme, weniger Informationen über Exception Stacktrace)

Ich denke, diese Linie, incercari.setText(valIncercari);Exception wirft , da valIncercariistint

So sollte es sein,

incercari.setText(valIncercari+"");

Oder

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

15
oder noch besser:Integer.toString(valIncercari);
Jave

6
wie String.valueOf (); das ruft Integer.toString und andere entsprechende toString-Methoden auf
Jan Rabe

4
Ich frage mich, warum Android Studio Sie nicht berät. Ich hatte das gleiche Problem beim Festlegen eines int-Werts in TextView.setText für einen Fehler.
Bheatcoker

2
@bheatcoker - wird setText(int)auch verwendet, um die String-Ressource anhand der ID abzurufen . Und in Android hat jede Ressourcen-ID einen intWert.
user370305

1
String.format ist der empfohlene Weg. setText (String.format (Locale.US, "% d", valIncercari));
Jeffrey

15

Ich wollte nur auf einen weiteren Grund hinweisen, warum dieser Fehler ausgelöst werden kann, wenn Sie eine Zeichenfolgenressource für eine Übersetzung Ihrer App definiert haben, aber keine Standard-Zeichenfolgenressource angegeben haben.

Beispiel für das Problem:

Wie Sie unten sehen können, hatte ich eine Zeichenfolgenressource für eine spanische Zeichenfolge "get_started". Es kann weiterhin im Code referenziert werden, aber wenn das Telefon nicht auf Spanisch ist, hat es keine Ressource zum Laden und Absturz beim Anrufen getString().

values-es / strings.xml

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

Verweis auf 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)

Lösung des Problems

Dies zu verhindern ist ganz einfach. Stellen Sie einfach sicher, dass Sie immer eine Standard-Zeichenfolgenressource haben, values/strings.xmldamit das Telefon, wenn es in einer anderen Sprache ist, immer über eine Ressource verfügt, auf die Sie zurückgreifen können.

values ​​/ strings.xml

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

values-de / 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>

Dieser eine Treffer, als ich Ressourcen von einem Android Studio-Projekt in ein anderes kopierte und die Datei strings.xml kopierte. Aufgrund von Caching / Neuladen / was auch immer verwarf es die neue Datei und behielt die alte bei. Also hatte ich die String-IDs aus der Übersetzung, aber nicht aus der einfachen string.xml
denispyr

14

Ein anderes Szenario, das diese Ausnahme verursachen kann, ist DataBinding, wenn Sie in Ihrem Layout so etwas verwenden

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

Beachten Sie, dass die von mir verwendete Variable eine Ganzzahl ist und ich sie dem Textfeld der Textansicht zuweise. Da die TextView bereits über eine Methode mit Signatur verfügt setText(int), wird diese Methode anstelle von und verwendet setText(String)und der Wert umgewandelt. Daher betrachtet die Textansicht Ihre Eingabenummer als einen Ressourcenwert, der offensichtlich nicht gültig ist.

Die Lösung besteht darin, Ihren int-Wert in einen solchen String umzuwandeln

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

Danke, es hat geholfen. Auch danach müssen Sie Build-> Clean Projectin Android Studio Datenbindungsklassen neu generieren.
Yamashiro Rion

9

Dieses Problem tritt hauptsächlich aufgrund des setText()Methodenfehlers auf

Lösung ist einfach, setzen Sie Ihren IntegerWert, indem Sie in stringTyp als konvertieren

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

1

Irgendwann geschah dies, weil ich keine Quelle mochte, wie wenn ich einen Text vom Adapter in eine Textansicht setzen möchte, dann sollte ich verwenden

 textView.setText(""+name);

Wenn du so etwas schreibst

 textView.setText(name);

Dies wird nicht funktionieren und manchmal finden wir die Ressource nicht aus der Datei string.xml, dann tritt diese Art von Fehler auf.


0

Die Ausnahme besteht darin, DataBinding zu verwenden und den Hintergrund für den Edittext mit Ressourcen aus dem Zeichenordner festzulegen.

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

Lösung

Ich ändere einfach den Hintergrund von android:background="@drawable/rectangle"nach android:background="@null"

Bereinigen Sie das Projekt und erstellen Sie es neu.


-1

Sie weisen einem Textfeld einen numerischen Wert zu. Sie müssen den numerischen Wert in eine Zeichenfolge konvertieren mit:

String.valueOf(variable)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.