Question 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, 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?


423
2017-09-21 00:19


origine


Réponses:


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 Context classe. Si vous êtes à l'intérieur d'un Activity ou un Service (qui étendent le contexte) vous pouvez l'utiliser comme dans cet extrait.

Aussi notez 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, mettez simplement les chaînes anglaises dans res/values/strings.xml. Ensuite, créez un nouveau dossier values-ru et mettre les chaînes russes avec des noms identiques dans res/values-ru/strings.xml. À partir de ce moment-là, android sélectionne le bon en fonction des paramètres régionaux de l'appareil, que vous appeliez getString() ou lors du référencement de 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 Fournir des ressources pour plus d'informations.


852
2017-09-21 00:36



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

265
2017-07-21 20:47



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

57
2017-11-20 14:54



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

36
2018-06-13 12:07



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

25
2018-05-08 15:24



Le plus simple est d'utiliser le getString() fonctionner au sein de 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 Android récente, toute personne connaissant l’histoire peut commenter cette fonctionnalité.


12
2017-10-29 19:43



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

7
2017-12-16 15:59



Il y a aussi un ensemble de chaînes Android prédéfinies tels 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, chaîne "Ok"). BTW il y a aussi d'autres ressources Android disponibles comme par exemple des images d'icônes etc.


4
2018-04-20 07:06



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 pouvant être dessiné 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);

2
2018-04-27 17:56



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

moyen facile


0
2018-03-14 09:11



Meilleure approche unique

est App.getRes().getString(R.string.some_id) cela fonctionnera partout dans l'application.

J'ai lu toutes les réponses, toutes les réponses peuvent faire votre travail.

  • Vous pouvez utiliser getString(R.string.some_string_id) à la fois Activity ou Fragment.
  • Vous pouvez utiliser Context.getString(R.string.some_string_id) où vous n'avez pas accès direct à getString()méthode. Comme Dialog.

Problème

Quand tu n'as pas Context accès, comme une méthode dans votre Util classe.

Supposons ci-dessous la méthode sans contexte.

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

Maintenant vous passerez Context en tant que paramètre dans cette méthode et l'utilisation getString().

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

Ce que je fais est 

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

Quelle? Il est très simple à utiliser n'importe où dans votre application!

Alors voici un Solution unique bonus par lequel vous pouvez accéder à des ressources de partout comme Util class .

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

public class App extends Application {
    private static App mInstance;
    private static Resources res;


    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        res = getResources();
    }

    public static App getInstance() {
        return mInstance;
    }

    public static Resources getResourses() {
        return res;
    }

}

Ajouter un champ de nom à votre manifest.xml  <application marque.

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

Maintenant, vous êtes prêt à partir. Utilisation App.getRes().getString(R.string.some_id) partout dans l'application.


0
2017-07-11 07:09