web-dev-qa-db-fra.com

Android: Comment puis-je obtenir une chaîne à partir de ressources utilisant son nom?

Je voudrais avoir 2 langues pour l'interface utilisateur et des valeurs de chaîne distinctes pour elles dans mon fichier de ressources 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>

Maintenant, je dois récupérer ces valeurs de manière dynamique dans mon application:

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);

Mon problème est que i = 0.

Pourquoi ça ne marche pas dans mon cas?

471
Ivan

Le lien auquel vous faites référence semble fonctionner avec les chaînes générées au moment de l'exécution. Les chaînes de strings.xml ne sont pas créées au moment de l'exécution. Vous pouvez les obtenir via

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

getResources() est une méthode de la classe Context. Si vous êtes dans un Activity ou un Service (qui étendent le contexte), vous pouvez l'utiliser comme dans cet extrait de code.

Notez également que la dépendance à la langue entière peut être prise en charge par le cadre Android . Créez simplement des dossiers différents pour chaque langue. Si l'anglais est votre langue par défaut, il suffit de mettre les chaînes anglaises dans res/values/strings.xml. Créez ensuite un nouveau dossier values-ru et mettez les chaînes russes portant des noms identiques dans res/values-ru/strings.xml. À partir de ce point, sur Android, sélectionnez celui qui convient en fonction de l'environnement local de l'appareil que vous souhaitez, soit lorsque vous appelez getString(), soit que vous référencez des chaînes au format XML via @string/mystring. Ceux de res/values/strings.xml sont les solutions de secours. Si vous ne disposez pas d'un dossier couvrant les paramètres régionaux des utilisateurs, celui-ci sera utilisé comme valeur par défaut.

Voir Localisation et Fournir des ressources pour plus d'informations.

992
user658042

J'ai le même problème. Mais ce code ci-dessous fonctionne pour moi: Vérifiez si votre nom de paquet est correct. Vous devez vous référer au package racine de votre application Android.

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

Pas d'activités seulement:

    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

J'ajouterais quelque chose à la solution de leonvian, donc si par hasard la chaîne n'était pas trouvée parmi les ressources (valeur de retour 0, ce n'est pas un code de ressource valide), la fonction pourrait retourner quelque chose:

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

Le moyen le plus simple consiste à utiliser la fonction getString() dans l’activité.

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

Référence: http://developer.Android.com/guide/topics/resources/string-resource.html

Je pense que cette fonctionnalité est ajoutée dans une version récente d'Android, toute personne connaissant l'historique peut commenter à ce sujet.

13
Eren Yilmaz

Un moyen simple d'obtenir une chaîne de ressource d'une chaîne dans un TextView. Ici resourceName est le nom de la ressource 

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

Si vous n'avez pas de référence d'activité, vous pouvez utiliser votre contexte de cette manière:

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

Il existe également un ensemble de chaînes Android prédéfinies telles que "Ok", "Annuler" et bien d'autres - afin que vous n'ayez pas à tout déclarer. Ils sont disponibles simplement par:

getString(Android.R.string.ok)

(Dans ce cas, chaîne "Ok"). En passant, d'autres ressources Android sont également disponibles, par exemple des images d'icônes, etc.

4
forsberg

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

moyen facile

1
Avinash

Vous pouvez essayer ceci dans une activité:

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

Dans d'autres situations comme des fragments, ... utilisez

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

Pour plus de sécurité, vous devez ajouter:

mContext peut être: context dans onAttach () de Fragment ou this of Activity.

0
O Thạnh Ldt