2009-12-31 13 views
53

Ich dachte, ich wäre elegant und benutze die string.xml-Datei, um einige konstante Zeichenfolgen für Dinge wie Ausnahmemeldungen zu definieren. In strings.xml drücke ich Add, wähle die "String" -Option (nicht 'String Array') und gebe ihm einen Namen und einen Wert. Ich war überrascht zu sehen, dass dieser Code nicht funktioniert:Eclipse/Java - Werte in R.string. * Return int?

throw new Exception(R.string.MyExceptionMessage); 

Und das schlägt fehl, weil R.string.MyExceptionMessage tatsächlich vom Typ int ist. Ich kann diesen Typ überprüfen, indem ich in R.java nachschaue. Was vermisse ich?

Antwort

100

Alles in der R Klasse ist eine Referenz, daher ist es nur als int definiert.

Wenn Ihr Code innerhalb — läuft oder hat Zugriff auf — ein Android Context, können Sie context.getString(R.string.my_exception_message) rufen Sie den tatsächlichen String Wert zu erhalten.

Oder für Dinge wie Ausnahme Zeichenfolgen, die nicht übersetzt werden müssen und so nicht unbedingt in einer Android-Ressource. XML-Datei definiert werden müssen, könnten Sie die Zeichenfolgen als Konstanten in einer Art von StringConstants-Schnittstelle speichern . Auf diese Weise können Sie auf die Strings innerhalb von Utility-Klassen verweisen, die möglicherweise keinen Zugriff auf die Context haben.

+8

Chris ist auf beiden Konten richtig. Context.getString lädt Ihre String-Ressource. Aber hüte dich davor, nicht lokalisierbares Zeug dort zu platzieren, da es sich mit deinen Strings für die Übersetzung verwechseln wird. Ich würde es nicht als klassisch betrachten, sondern als MUSS, Ihre UI-Strings in die XML-Dateien und nicht in den Code zu schreiben. An einem bestimmten Punkt werden Sie Ihre Apps in andere Länder verteilen wollen, und um sie aus dem Code zu entfernen, wird eine Menge Aufwand erforderlich sein. Mach es jetzt und rette die Kopfschmerzen. Ich habe einen Distributor in China Ich schicke ihr einfach die strings.xml für die Übersetzung, keine Mühe. Grüße, Ari – BeMeCollective

5

Chris hat Recht. Was aber, wenn Sie auch die Exception-Zeichenfolge lokalisieren möchten. Beispielsweise werfen Sie eine Exception, und wenn Sie sie abfangen, möchten Sie dem Benutzer die Exception-Nachricht anzeigen. Ich möchte sie in strings.xml setzen, aber zur gleichen Zeit möchte ich nicht diesen Code

throw new Exception(context.getString(R.string.my_exception_message)) 

verwenden, weil ich glaube, dass, wenn Sie eine Ausnahme haben es wahrscheinlich Sie nicht wollen, und Sie können‘ Verwenden Sie zusätzlichen Code, um die Ausnahmebedingungsnachricht zu erhalten.

Ich denke, die einzige Lösung, wie dies eine statische String für diese Nachricht in Ihrer Haupt-Aktivität und initialisieren es so schnell wie möglich (in der onCreate() -Methode zum Beispiel) zu erklären wäre:

private static String my_exception_message; 

public onCreate() 
{ 
    my_exception_message = context.getString(R.string.my_exception_message); 
} 

Wenn Sie also die Ausnahme auslösen, haben Sie Ihre lokalisierte Nachricht bereit, sie zu verwenden. Was denkst du? Können Sie sich andere Lösungen vorstellen?

29

Verwenden Sie die Methode "getResources(). GetString (id)".

getResources().getString(R.string.title_activity) 

Und Boom, Sie haben Ihre Zeichenfolge. Stellen Sie sicher, dass Sie diese Zeichenfolge in der Datei string.xml im Werteordner speichern.

+1

getResources() -Methode ist nicht immer verfügbar. –

+0

"kann Methode getResources nicht auflösen" – moonvader