2013-06-30 5 views
5

Anwendung löst eine Ausnahme

android.content.res.Resources $ NotFoundException: String Ressource ID

Mein Fall war nicht das gemeinsame (da angegebene ID existiert). Ich habe diese Frage gestellt, um es selbst zu beantworten.

Bitte unten meine Antwort, warum konnte das passieren und warum es für mich passiert ist.

Antwort

17

Sie gefunden vielleicht schon, dass dieser Fehler passiert, wenn wir eine ganze Zahl als String wie zu setzen versuchen: irgendwo im Code some_variable erklärt wurde als int und dann versucht, es zu some_textview mit setText() Verfahren einzustellen:

int some_variable = 0; 
TextView some_textview = (TextView) findViewById(R.id.someTextView); 
... some code/calculations etc... 
some_textview.setText(some_variable); // exception! some_variable is an int value 

es könnte auch ein Ergebnis, das durch ein beliebiges Verfahren sein, die zurück int als Ergebnis zurückgibt, wie:

some_textview.setText(someString.length());// exception! String.length() returns an int value 
some_textview.setText(someSet.size());// exception! Set.size() returns an int value 

usw.

diese Ursachen die Resources$NotFoundException cuz gibt es keine String Ressource mit einer solchen Nummer (id). R.java hat statische Variablen, wobei jede String ihre eigene eindeutige Nummer hat (ID, und Sie verwenden sie im Code als R.string. ID). Es könnte wahrscheinlich passieren, dass some_variable eine gültige Nummer hat, aber in diesem Fall wird dem Benutzer eine falsche Textzeichenfolge in some_textview angezeigt.
Die Lösung für dieses Problem ist einfach (wenn some_variable ‚s-Wert angezeigt werden muß):

some_textview.setText(String.valueOf(some_variable)); 

Es gibt auch eine Reihe von Menschen, die den int Wert auf die gleiche Weise an die Toast Nachricht zu setzen versuchen, wie:

int some_variable = 0; 
... some code/calculations etc... 
Toast.makeText(this, some_variable, Toast.LENGTH_LONG).show(); 
Toast.makeText(getBaseContext(), someSet.size(), Toast.LENGTH_LONG).show(); 

das Update ist das gleiche:

int some_variable = 0; 
... some code/calculations etc... 
Toast.makeText(this, String.valueOf(some_variable), Toast.LENGTH_LONG).show(); 
Toast.makeText(getBaseContext(), String.valueOf(some_Set.size()), Toast.LENGTH_LONG).show(); 

Sie vielleicht Met Fixes, die Integer(some_variable).toString() Ansatz verwendet. Es ist nicht schlecht. Dies bedeutet jedoch, dass nur ganzzahlige Werte verwendet werden können (oder NumberFormatException werden geworfen) als für String.valueOf(some_variable) es ist egal, denn es funktioniert für jede Art von Wert, einschließlich aller Grundelemente (float, double, byte, long usw.) und wird nie Irgendeine Ausnahme werfen.
Aber es gibt einige andere Fälle. The rare cases are described here und der Punkt ist das Projekt in Eclipse zu reinigen.
Falls Sie ziemlich sicher sind, dass Sie keine Zahlen an die Methode übergeben, die String akzeptiert, und dies geschieht mit einer App, die freigegeben wird (und nicht während der Entwicklung passiert), könnte es ein Fall sein, wenn Ihre App Locale hat hing String Ressourcen ab. Und wenn du es getestet hast, hast du es wahrscheinlich mit deinen regionspezifischen Locale Geräten gemacht, so dass keine Probleme entdeckt wurden. In diesem Fall sollten Sie jedoch den Standardordner strings.xml im Ordner res\values eines Projekts angeben. Wenn Sie es verpassen, ist dies wahrscheinlich der Fall.Wenn einige Benutzer, können sagen, von einem Deutschland, wer Standard Locale ist DE versucht, solche App zu laufen (die nur strings.xml in Ordnern hat wie values-en, values-it usw., aber es gibt keine strings.xml in values noch in values-de Ordner) einen Absturz mit Resources$NotFoundException fangen .
Die Lösung für dieses Problem ist, wie ich bereits erwähnt habe, eine Standard strings.xml in res\values Ordner eines Projekts oder um sicherzustellen, dass Ihre Anwendung (in Application-Exteted-Klasse zum Beispiel) eine richtige Standardgebietsschema für Ihre App setzt läuft auf einem Gerät mit nicht unterstütztem Gebietsschema, wie:

Locale locale = getAppLocale(context); 
    String localeLang = locale.getLanguage(); 
    // default locale is EN but available are EN and RU 
    if (!localeLang.equalsIgnoreCase("en") && !localeLang.equalsIgnoreCase("ru")) 
     locale = new Locale("en"); 
    Configuration config = new Configuration(); 
    config.locale = locale; 

    context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); 
+0

Perfekt! meiner war der Sprachordner! – Prachi

Verwandte Themen