Ich möchte 2 Sprachen für die Benutzeroberfläche und separate Zeichenfolgenwerte für diese in meiner Ressourcendatei haben res\values\strings.xml
:
<string name="tab_Books_en">Books</string>
<string name="tab_Quotes_en">Quotes</string>
<string name="tab_Questions_en">Questions</string>
<string name="tab_Notes_en">Notes</string>
<string name="tab_Bookmarks_en">Bookmarks</string>
<string name="tab_Books_ru">Книги</string>
<string name="tab_Quotes_ru">Цитаты</string>
<string name="tab_Questions_ru">Вопросы</string>
<string name="tab_Notes_ru">Заметки</string>
<string name="tab_Bookmarks_ru">Закладки</string>
Jetzt muss ich diese Werte dynamisch in meiner App abrufen:
spec.setContent(R.id.tabPage1);
String pack = getPackageName();
String id = "tab_Books_" + Central.lang;
int i = Central.Res.getIdentifier(id, "string", pack);
String str = Central.Res.getString(i);
Mein Problem ist das i = 0
.
Warum funktioniert es in meinem Fall nicht?
en
oder istru
?Antworten:
Der Link, auf den Sie verweisen, scheint mit zur Laufzeit generierten Zeichenfolgen zu funktionieren. Die Zeichenfolgen aus strings.xml werden zur Laufzeit nicht erstellt. Sie können sie über erhalten
getResources()
ist eine Methode derContext
Klasse. Wenn Sie sich in einemActivity
oder einemService
(das den Kontext erweitert) befinden, können Sie es wie in diesem Snippet verwenden.Auch beachten Sie, dass die ganze Sprachabhängigkeit Pflege durch den Androiden Rahmen genommen werden kann . Erstellen Sie einfach unterschiedliche Ordner für jede Sprache. Wenn Englisch Ihre Standardsprache ist, geben Sie einfach die englischen Zeichenfolgen ein
res/values/strings.xml
. Erstellen Sie dann einen neuen Ordnervalues-ru
und fügen Sie die russischen Zeichenfolgen mit identischen Namen einres/values-ru/strings.xml
. Ab diesem Zeitpunkt wählt Android je nach Gebietsschema des Geräts das richtige für Sie aus, entweder beim AufrufengetString()
oder beim Verweisen auf Zeichenfolgen in XML über@string/mystring
. Diejenigen vonres/values/strings.xml
sind die Fallback-Dateien. Wenn Sie keinen Ordner haben, der das Gebietsschema des Benutzers abdeckt, wird dieser als Standardwerte verwendet.Weitere Informationen finden Sie unter Lokalisierung und Bereitstellen von Ressourcen .
quelle
android.support.v4.app.Fragment
, können Sie einfachgetString(R.string.mystring)
direkt anrufen .Ich habe das gleiche Problem. Der folgende Code funktioniert jedoch für mich: Überprüfen Sie, ob Ihr Paketname korrekt ist. Sie müssen auf das Root-Paket Ihrer Android-Anwendung verweisen.
quelle
string
und nichtstrings
. Weil das logisch ist (wie der Rest des Android). Also, danke dafür (und mehr), @leonvian. :-)String someStringFromXML = getString(getResources().getIdentifier("some_string_name", "string", getPackageName()));
.Nicht nur von Aktivitäten:
quelle
quelle
Ich würde der Lösung von leonvian etwas hinzufügen. Wenn also die Zeichenfolge zufällig nicht in den Ressourcen gefunden wird (Rückgabewert 0, das ist kein gültiger Ressourcencode), gibt die Funktion möglicherweise Folgendes zurück:
quelle
Bester Ansatz
App.getRes().getString(R.string.some_id)
Funktioniert überall (Utils, Modelle auch).
Ich habe alle Antworten gelesen, alle Antworten können Ihre Arbeit erledigen.
getString(R.string.some_string_id)
in beidenActivity
oder verwendenFragment
.Context.getString(R.string.some_string_id)
wenn Sie keinen direkten Zugriff auf diegetString()
Methode haben. WieDialog
.Problem
Wenn Sie keinen
Context
Zugriff haben , wie eine Methode in IhrerUtil
Klasse.Nehmen Sie die folgende Methode ohne Kontext an.
Jetzt werden Sie
Context
als Parameter in dieser Methode übergeben und verwendengetString().
Was ich tue ist
Was? Es ist sehr einfach, überall in Ihrer App zu verwenden!
Hier ist also eine Lösung, mit der Sie von überall auf Ressourcen zugreifen können
Util class
.Fügen Sie Ihrem
manifest.xml
<application
Tag ein Namensfeld hinzu.Jetzt können Sie loslegen. Verwenden Sie
App.getAppResources().getString(R.string.some_id)
überall in der App.quelle
getResourses
, diegetResources
zu einem Überschreiben führen würde. Auch das Singleton-Muster scheint unnötig, könnte möglicherweise übersprungen werden. Gibt es Probleme mit Speicherlecks bei dieser Lösung?Einfacher ist es, die
getString()
Funktion innerhalb der Aktivität zu verwenden.Referenz: http://developer.android.com/guide/topics/resources/string-resource.html
Ich denke, diese Funktion wurde in einer aktuellen Android-Version hinzugefügt. Jeder, der den Verlauf kennt, kann dies kommentieren.
quelle
Eine einfache Möglichkeit, Ressourcenzeichenfolgen von Zeichenfolgen in eine Textansicht abzurufen. Hier ist resourceName der Name der Ressource
quelle
Wenn Sie keine Aktivitätsreferenz haben, können Sie Ihren Kontext folgendermaßen verwenden:
quelle
Es gibt auch eine Reihe vordefinierter Android-Zeichenfolgen wie "Ok", "Abbrechen" und viele andere - Sie müssen also nicht alle deklarieren. Sie sind einfach erhältlich bei:
(In diesem Fall "Ok" Zeichenfolge). Übrigens gibt es auch andere Android-Ressourcen wie zum Beispiel Symbole Bilder usw.
quelle
String myString = getString (R.string.mystring);
einfacher Weg
quelle
Sie können dies in einer Aktivität versuchen:
In anderen Situationen wie Fragmenten, ... verwenden
quelle
Zur Sicherheit sollten Sie Folgendes hinzufügen: mContext.getResources (). GetString (R.string.your_string);
mContext kann sein: Kontext in onAttach () von Fragment oder this of Activity.
quelle
Wenn Sie es in eine Aktivität oder ein Fragmnet bekommen möchten, dann:
Wenn Sie es von einer Klasse außerhalb einer Aktivität oder eines Fragments erhalten möchten, in der Sie nicht über den Aktivitätskontext verfügen, verwenden Sie den Anwendungskontext:
quelle
Verwenden Sie diese Zeile direkt in Ihrer Java-Datei. Halte es einfach.
quelle