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?
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.
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);
}
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()));
}
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))
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);
}
}
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.
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);
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);
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.
String myString = getString (R.string.mystring);
moyen facile
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);
Pour plus de sécurité, vous devez ajouter:
mContext peut être: context dans onAttach () de Fragment ou this of Activity.