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


Je voudrais avoir 2 langues pour l'interface utilisateur et séparer les valeurs de chaîne pour eux 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, j'ai besoin de 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 . Ce code a été pris à partir de ce lien .

Pourquoi ça ne marche pas dans mon cas?



Answers


Le lien auquel vous faites référence semble fonctionner avec les chaînes générées lors de l'exécution. Les chaînes de strings.xml ne sont pas créées lors 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 une Activity ou un Service (qui étend le contexte), vous pouvez l'utiliser comme dans cet extrait.

Notez également que toute la dépendance de la langue peut être pris en charge par le cadre android . Créez simplement différents dossiers pour chaque langue. Si l'anglais est votre langue par défaut, placez simplement les chaînes anglaises dans res/values/strings.xml . Créez ensuite un nouveau dossier values-ru et placez les chaînes russes avec des noms identiques dans res/values-ru/strings.xml . À partir de ce point sur android sélectionne le bon en fonction des paramètres régionaux du périphérique pour vous, soit lorsque vous appelez getString() ou lorsque vous référencez des chaînes en XML via @string/mystring . Ceux de res/values/strings.xml sont ceux de secours, si vous n'avez pas de dossier couvrant les paramètres régionaux des utilisateurs, celui-ci sera utilisé comme valeurs par défaut.

Voir Localisation et fourniture de 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 package 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 seulement des activités:

    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'est 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);
    }
}






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

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



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

getString(android.R.string.ok)

(Dans ce cas, "Ok" chaîne). BTW il y a aussi d'autres ressources Android disponibles comme par exemple des images d'icônes etc.




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



Un moyen simple d'obtenir l'ID de ressource à partir d'une chaîne. Ici, resourceName est le nom de la ressource ImageView dans le dossier drawable qui est également inclus dans le fichier XML.

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