it-swarm.com.de

Android: Wie erhalte ich Zeichenketten aus ihrem Namen?

Ich möchte zwei Sprachen für die Benutzeroberfläche und separate Zeichenfolgenwerte 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.

Warum funktioniert es nicht in meinem Fall?

471
Ivan

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

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

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

Auch Beachten Sie, dass die gesamte Sprachabhängigkeit vom Android-Framework übernommen werden kann. Erstellen Sie einfach unterschiedliche Ordner für jede Sprache. Wenn Englisch Ihre Standardsprache ist, geben Sie einfach die englischen Zeichenfolgen in res/values/strings.xml ein. Erstellen Sie dann einen neuen Ordner values-ru und geben Sie die russischen Zeichenfolgen mit identischen Namen in res/values-ru/strings.xml ein. Ab diesem Zeitpunkt wählt Android je nach Gerätegebietsschema das richtige für Sie aus, entweder wenn Sie getString() aufrufen oder wenn Sie Zeichenfolgen in XML über @string/mystring..__ referenzieren. Die von res/values/strings.xml sind die Fallback-Zeichenfolgen, falls Sie keine haben Ordner, der das Gebietsschema des Benutzers abdeckt, wird dieser als Standardwert verwendet.

Weitere Informationen finden Sie unter Lokalisierung und Bereitstellung von Ressourcen .

936
user658042

Ich habe das gleiche Problem. Der folgende Code funktioniert jedoch für mich: Ü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);
    }
284
leonvian

Nicht nur bei Aktivitäten:

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

Ich würde der Lösung von leonvian etwas hinzufügen. Wenn also die Zeichenfolge unter Umständen nicht gefunden wird (Rückgabewert 0, das ist kein gültiger Ressourcencode), 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);
    }
}
25
Miguel Rivero

Einfacher geht es mit der Funktion getString() innerhalb der Aktivität.

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

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 die Historie kennt, kann dies kommentieren.

13
Eren Yilmaz

Eine einfache Methode, um einen Ressourcenstring aus einem String in eine TextView abzurufen. Hier ist Ressourcenname der Name der Ressource 

int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);
8
Muhammad Adil

Wenn Sie keine Aktivitätsreferenz haben, können Sie Ihren Kontext auf folgende Weise verwenden:

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

Bester Ansatz

App.getRes().getString(R.string.some_id) 

Funktioniert überall (Utils, Models auch).

Ich habe alle Antworten gelesen, alle Antworten können Ihre Arbeit erledigen. 

  • Sie können getString(R.string.some_string_id) in beidenActivityoderFragmentverwenden.
  • Sie können Context.getString(R.string.some_string_id) verwenden, wenn Sie keinen direkten Zugriff auf die getString()-Methode haben. Wie Dialog.

Problem

Wenn Sie keinen Context-Zugriff haben wie eine Methode in Ihrer Util-Klasse.

Angenommene Methode ohne Kontext.

public void someMethod(){
    ...
    // can't use getResource() or getString() without Context.
}

Nun übergeben Sie in dieser Methode Context als Parameter und verwenden getString()..

public void someMethod(Context context){
    ...
    context.getString(R.string.some_id);
}

Was ich mache ist  

public void someMethod(){
    ...
    App.getAppResources().getString(R.string.some_id)
}

Was? Es ist sehr einfach, überall in Ihrer App zu verwenden!

Hier ist also eineLösung , mit der Sie von überall auf Ressourcen wie Util class zugreifen können.

import Android.app.Application;
import Android.content.res.Resources;

public class App extends Application {
    private static Resources resources;

    @Override
    public void onCreate() {
        super.onCreate();

        resources = getResources();
    }

    public static Resources getAppResources() {
        return resources;
    }

}

Fügen Sie Ihrem manifest.xml<application-Tag ein Namensfeld hinzu.

<application
        Android:name=".App"
        ...
        >
        ...
    </application>

Jetzt bist du gut zu gehen. Verwenden Sie App.getAppResources().getString(R.string.some_id) überall in der App.

5
Khemraj

Es gibt auch eine Reihe von vordefinierten Android-Strings wie "Ok", "Cancel" und viele andere - damit Sie nicht alle deklarieren müssen. Sie sind einfach erhältlich bei:

getString(Android.R.string.ok)

(In diesem Fall "Ok" -String). Übrigens gibt es auch andere Android-Ressourcen wie beispielsweise Icons, Bilder usw.

4
forsberg

String myString = getString (R.String.mystring);

einfacher Weg

1
Avinash

Sie können dies in einer Aktivität versuchen:

getResources().getString(R.string.your string name);

In anderen Situationen wie Fragmenten ... verwenden

getContext().getResources().getString(R.string.your string name);
0

Zum Schutz sollten Sie Folgendes hinzufügen: MContext.getResources (). GetString (R.string.your_string);

mContext kann sein: context in onAttach () von Fragment oder this von Activity.

0
O Thạnh Ldt