2009-12-31 6 views
53

Je pensais que je serais chic et utiliser le fichier string.xml pour définir des chaînes de caractères constantes pour des choses comme les messages d'exception. Dans strings.xml je clique sur Add, choisis l'option "String" (pas "String Array"), puis lui donne un nom et une valeur. Je fus surpris de voir que ce code ne fonctionne pas:Eclipse/Java - Valeurs dans R.string. * Return int?

throw new Exception(R.string.MyExceptionMessage); 

Et échoue parce que R.string.MyExceptionMessage est en fait de type int. Je peux vérifier ce type en regardant R.java. Qu'est-ce que je rate?

Répondre

100

Tout dans la classe R est une référence, donc il est simplement défini comme int.

Si votre code est en cours d'exécution au sein — ou a accès à un Android — Context, vous pouvez appeler context.getString(R.string.my_exception_message) pour obtenir la valeur réelle String. Ou, pour des choses comme les chaînes d'exception qui n'ont pas besoin d'être traduites et qui n'ont donc pas besoin d'être définies dans un fichier .xml de ressources Android, vous pouvez stocker les chaînes comme des constantes dans une interface StringConstants . De cette façon, vous pouvez vous référer aux chaînes de classes d'utilitaires qui n'ont pas accès au Context.

+8

Chris a raison sur les deux comptes. Context.getString charge votre ressource de chaîne. Mais méfiez-vous d'y mettre des trucs non-localisables car ils se mélangeront avec vos cordes pour la traduction. Je ne le considérerais pas classy, ​​mais un MUST pour mettre vos chaînes d'interface utilisateur dans les fichiers XML et pas dans le code. À un certain point, vous voudrez distribuer vos applications dans d'autres pays, et pour les sortir du code, vous aurez besoin de beaucoup d'efforts. Faites-le maintenant et sauvez le mal de tête. J'ai un distributeur en Chine Je lui envoie juste les cordes.xml pour la traduction, sans effort. Cordialement, Ari – BeMeCollective

5

Chris a raison. Mais que faire si vous voulez localiser la chaîne Exception aussi. Par exemple, vous lancez une exception et lorsque vous l'attrapez, vous voulez afficher le message d'exception à l'utilisateur. Je voudrais les mettre en strings.xml mais en même temps, je ne veux pas utiliser ce code

throw new Exception(context.getString(R.string.my_exception_message)) 

parce que je pense que si vous avez une exception que vous ne voulez probablement pas et vous pouvez » t utiliser du code supplémentaire pour obtenir le message d'exception.

Je pense que la seule solution serait de déclarer une chaîne statique pour ce message dans votre activité principale et initialiser le plus rapidement possible (par exemple dans la méthode onCreate()) comme ceci:

private static String my_exception_message; 

public onCreate() 
{ 
    my_exception_message = context.getString(R.string.my_exception_message); 
} 

Ainsi, lorsque vous lancez l'exception, votre message localisé est prêt à l'utiliser. Qu'est-ce que vous en pensez? Vous pouvez penser à d'autres solutions?

29

Utilisez la méthode "getResources(). GetString (id)".

getResources().getString(R.string.title_activity) 

Et boom, vous avez votre chaîne. Veillez à stocker cette chaîne dans votre fichier string.xml dans le dossier values.

+1

La méthode getResources() n'est pas toujours disponible. –

+0

"impossible de résoudre la méthode getResources" – moonvader