2010-08-21 3 views
21

Ich habe ein paar Strings, die ich übersetzen und anzeigen muss. Diese Zeichenfolgen sind in Variablen. Ich habe die Übersetzung in der Datei strings.xml.Zugriff auf Inhalt von R.string mit einer Variablen zur Darstellung des Ressourcennamens

Ich möchte die "übersetzte Version" der Zeichenfolge anzeigen. Zum Beispiel, in einer Aktivität:

String name = "Water"; 
TextView nameDisplay = new TextView(this). 
nameDisplay.setText(name); 

In der Zeichenketten-Datei ich die Definition habe

<string name="Water">French word for Water</string> 

Wenn ich etwas wie folgt verwendet:

nameDisplay.setText(R.string.KnownName); 

es funktionieren würde. Aber in meinem Fall ist der Name in einer Variablen gespeichert, so dass ich nicht weiß, was zu tun ist, damit die setText-Methode richtig funktioniert.

Meine aktuelle Problemumgehung ist

String translation = "" 

if(name == "Water") { 
    translation = getString(R.string.Water); 
} 
else { 
    ... 
} 

nameDisplay.setText(translation); 

... aber nicht sehr gut skalieren.

Irgendwelche Vorschläge?

Soll ich die übersetzte Version in der Variablen speichern?

Antwort

40

können Sie die Methode verwenden String in int Kennung zu konvertieren:

public static int getStringIdentifier(Context context, String name) { 
    return context.getResources().getIdentifier(name, "string", context.getPackageName()); 
} 

Pass in einer Aktivität als Kontext-Parameter (oder eine andere Kontextinstanz). Dann können Sie den Bezeichner wie gewohnt mit der Methode getString() verwenden.

Beachten Sie, dass die Konvertierung von String zu Bezeichner Reflektion verwendet und daher nicht so schnell sein kann.

+0

Hallo. Vielen Dank für Ihren Kommentar. Es klappt. Danke auch für die Warnung vor dem möglichen Leistungsverlust. – MyNameIsZero

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

Es wird empfohlen, context.getPackageName() für den Paketparameter zu verwenden – estoke

0

Eine andere Sache, die Sie tun können, ist, die Zeichenfolge der Ressource zuzuordnen. Auf diese Weise können Sie die Zeichenfolge in einer Variablen haben (oder sie programmgesteuert erstellen) und dann die Zuordnung verwenden, um die Ressourcen-ID zu suchen.

Beispiel

strings.xml

<string name="water_english">water</string> 
<string name="water_spanish">agua</string> 
<string name="water_chinese">水</string> 
<string name="water_mongolian">ᠤᠰᠥ</string> 

-Code

public class MainActivity extends AppCompatActivity { 

    private Map<String, Integer> stringForResourceIdMap = createMap(); 

    private Map<String, Integer> createMap() { 
     Map<String, Integer> result = new HashMap<>(); 

     result.put("water_english", R.string.water_english); 
     result.put("water_spanish", R.string.water_spanish); 
     result.put("water_chinese", R.string.water_chinese); 
     result.put("water_mongolian", R.string.water_mongolian); 

     return result; 
    } 

    private String getMyStringResource(String lookupString) { 
     int resourceId = stringForResourceIdMap.get(lookupString); // R.string.xxx 
     return getString(resourceId); 
    } 

    // ... 
} 

Hinweis

Wenn Sie localizing your app mit verschiedenen Übersetzungen haben, sollten Sie verschiedene Ressourcenordner verwenden.

Verwandte Themen