web-dev-qa-db-fra.com

Eclipse / Java - Valeurs dans R.string. * Return int?

Je pensais être chic et utiliser le fichier string.xml pour définir des chaînes constantes pour des choses comme les messages d'exception. Dans strings.xml, je clique sur Ajouter, je choisis l'option "String" (pas "String Array"), puis je lui donne un nom et une valeur. J'ai été surpris de voir que ce code ne fonctionne pas:

throw new Exception(R.string.MyExceptionMessage);

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

63
James Cadd

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

Si votre code est exécuté dans - ou a accès à - un Android Context, vous pouvez appeler context.getString(R.string.my_exception_message) pour obtenir le String réel valeur.

Ou, pour des choses comme les chaînes d'exceptions qui n'ont pas besoin d'être traduites et qui n'ont donc pas besoin d'être définies strictement dans un fichier de ressource Android .xml, vous pouvez stocker les chaînes sous forme de constantes dans une sorte d'interface StringConstants. De cette façon, vous pouvez vous référer aux chaînes des classes utilitaires qui peuvent ne pas avoir accès à Context.

115
Christopher Orr

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

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

Et boum, vous avez votre chaîne. Assurez-vous de stocker cette chaîne dans votre fichier string.xml dans le dossier de valeurs.

32
skidadon

Chris a raison. Mais que se passe-t-il si vous souhaitez également localiser la chaîne d'exception. Par exemple, vous lancez une exception et lorsque vous l'attrapez, vous souhaitez afficher le message d'exception à l'utilisateur. Je voudrais les mettre dans 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, vous ne voulez probablement pas et vous ne pouvez pas utiliser de 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 de l'initialiser dès que 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 lâchez l'exception, votre message localisé est prêt à être utilisé. Ce que tu penses? Vous pouvez penser à d'autres solutions?

5
PinoSan