676 Stimmen

Android: Wie erhalte ich eine Zeichenkette aus einer Ressource anhand ihres Namens?

Ich möchte 2 Sprachen für die UI und separate Zeichenfolgenwerte für sie 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 Anwendung 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, dass i = 0 .

Warum funktioniert es in meinem Fall nicht?

1246voto

Der Link, auf den Sie sich beziehen, scheint mit zur Laufzeit generierten Zeichenketten zu funktionieren. Die Zeichenketten aus strings.xml werden nicht zur Laufzeit erstellt. Sie können sie über

String mystring = getResources().getString(R.string.mystring);

getResources() ist eine Methode der Context Klasse. Wenn Sie sich innerhalb einer Activity oder eine Service (die Context erweitern) können Sie es wie in diesem Ausschnitt verwenden.

También beachten Sie, dass die gesamte Sprachabhängigkeit vom Android-Framework übernommen werden kann . Erstellen Sie einfach verschiedene Ordner für jede Sprache. Wenn Englisch Ihre Standardsprache ist, legen Sie die englischen Strings einfach in res/values/strings.xml . Erstellen Sie dann einen neuen Ordner values-ru und legen Sie die russischen Zeichenketten mit identischen Namen in res/values-ru/strings.xml . Von diesem Punkt an wählt Android je nach Gebietsschema des Geräts das richtige für Sie aus, entweder wenn Sie getString() oder beim Verweis auf Zeichenketten in XML über @string/mystring . Diejenigen aus res/values/strings.xml sind die Fallback-Werte, d.h. wenn Sie keinen Ordner haben, der das Gebietsschema des Benutzers abdeckt, wird dieser Ordner als Standardwert verwendet.

Ver Lokalisierung y Bereitstellung von Ressourcen für weitere Informationen.

396voto

leonvian Punkte 4579

Überprüfen Sie, ob Ihr Paketname korrekt ist. Sie müssen sich auf das Root-Paket Ihrer Android-Anwendung beziehen.

private String getStringResourceByName(String aString) {
      String packageName = getPackageName();
      int resId = getResources().getIdentifier(aString, "string", packageName);
      return getString(resId);
    }

98voto

konmik Punkte 2950

Nicht nur aus Aktivitäten:

public static String getStringByIdName(Context context, String idName) {
    Resources res = context.getResources();
    return res.getString(res.getIdentifier(idName, "string", context.getPackageName()));
}

41voto

TOUDIdel Punkte 1255
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))

29voto

Miguel Rivero Punkte 1346

Ich würde etwas zu der Lösung von leonvian hinzufügen, so dass, wenn durch irgendeinen Zufall die Zeichenfolge nicht unter den Ressourcen gefunden wird (Rückgabewert 0, das ist kein gültiger Ressourcencode), die Funktion etwas zurückgeben könnte:

private String getStringResourceByName(String aString) {
    String packageName = getPackageName();
    int resId = getResources()
            .getIdentifier(aString, "string", packageName);
    if (resId == 0) {
        return aString;
    } else {
        return getString(resId);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X