Android: Wie bekomme ich einen String aus Ressourcen mit seinem Namen?


Ich hätte gerne zwei Sprachen für die Benutzeroberfläche und separate String-Werte für sie in meiner Ressourcendatei 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, dass i = 0 . Dieser Code wurde diesem Link entnommen.

Warum funktioniert es nicht in meinem Fall?



Answers



Der Link, auf den Sie sich beziehen, scheint mit Zeichenfolgen zu arbeiten, die zur Laufzeit generiert werden. Die Zeichenfolgen von strings.xml werden zur Laufzeit nicht erstellt. Sie können sie über

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

getResources() ist eine Methode der Context Klasse. Wenn Sie sich in einer Activity oder einem Service (die den Kontext erweitern), können Sie sie wie in diesem Snippet verwenden.

Beachten Sie auch, 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, setzen Sie einfach die englischen Strings in res/values/strings.xml . Dann erstellen Sie einen neuen Ordner values-ru und fügen die russischen Strings mit identischen Namen in res/values-ru/strings.xml . Ab diesem Zeitpunkt wählt Android die richtige getString() aus, je nach dem Gebietsschema des Geräts für Sie, entweder wenn Sie getString() aufrufen oder Zeichenfolgen in XML über @string/mystring . Diejenigen aus res/values/strings.xml sind Fallback-Einträge. Wenn Sie keinen Ordner haben, der das Gebietsschema des Benutzers abdeckt, wird dieser als Standardwert verwendet.

Weitere Informationen finden Sie unter Lokalisierung und Bereitstellen von Ressourcen .




Ich habe das gleiche Problem. Aber dieser Code unten funktioniert für mich: Überprüfen Sie, ob Ihr Paketname korrekt ist. Sie müssen auf das Root-Paket Ihrer Android-Anwendung verweisen.

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



Nicht nur aus Aktivitäten:

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



getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))



Ich würde etwas zur Lösung von leonvian hinzufügen, also wenn die Zeichenkette zufällig unter den Betriebsmitteln gefunden wird (Rückgabewert 0, das ist kein gültiger Betriebsmittelcode), könnte die Funktion etwas zurückgeben:

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






Wenn Sie keine Aktivitätsreferenz haben, können Sie Ihren Kontext folgendermaßen verwenden:

getContext().getString(R.string.your_string_name);



Es gibt auch eine Reihe vordefinierter Android-Strings wie "Ok", "Cancel" und viele andere - Sie müssen also nicht alle deklarieren. Sie sind verfügbar einfach durch:

getString(android.R.string.ok)

(In diesem Fall "Ok" -String). Nebenbei gibt es noch andere Android-Ressourcen wie zum Beispiel Icons Bilder etc.




Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);



Eine einfache Möglichkeit, die Ressourcen-ID aus der Zeichenfolge abzurufen. Hier ist resourceName der Name der Ressource ImageView im Drawable-Ordner, der ebenfalls in der XML-Datei enthalten ist.

int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
    ImageView im = (ImageView) findViewById(resID);
    Context context = im.getContext();
    int id = context.getResources().getIdentifier(resourceName, "drawable",
    context.getPackageName());
    im.setImageResource(id);