Construire une application multilingue en Java. Obtention d'une erreur lors de l'insertion de la valeur de chaîne à partir du R.string
fichier XML de ressource:
public static final String TTT = (String) getText(R.string.TTT);
Voici le message d'erreur:
Erreur: impossible de faire une référence statique à la méthode non statique getText (int) à partir du type Contexte
Comment cela est-il causé et comment puis-je le résoudre?
getString()
quand vous en avez besoin. De cette façon, votre application s'adapte correctement aux utilisateurs qui changent la langue choisie.Réponses:
Puisqu'il
getText()
n'est pas statique, vous ne pouvez pas l'appeler à partir d'une méthode statique.Pour comprendre pourquoi, vous devez comprendre la différence entre les deux.
Les méthodes d'instance (non statiques) fonctionnent sur des objets d'un type particulier (la classe). Ceux-ci sont créés avec le nouveau comme ceci:
Pour appeler une méthode d'instance, vous l'appelez sur l'instance (
myObject
):Cependant, une méthode / un champ statique ne peut être appelé directement que sur le type, disons comme ceci:L'instruction précédente n'est pas correcte. On peut également faire référence à des champs statiques avec une référence d'objet commemyObject.staticMethod()
mais cela est déconseillé car cela n'indique pas clairement qu'il s'agit de variables de classe.Et les deux ne peuvent pas fonctionner ensemble car ils opèrent sur des espaces de données différents (données d'instance et données de classe)
Laissez-moi essayer de vous expliquer. Considérez cette classe (psuedocode):
Maintenant, j'ai le cas d'utilisation suivant:
Quelles sont les valeurs?
bien
En d'autres termes,
TTT
est une donnée partagée par toutes les instances du type. Donc ça n'a aucun sens de direLa question est donc de savoir pourquoi TTT est statique ou pourquoi getText () n'est-il pas statique?
Retirez le
static
et il devrait dépasser cette erreur - mais sans comprendre ce que fait votre type, ce n'est qu'un plâtre qui colle jusqu'à la prochaine erreur. Quelles sont les exigencesgetText()
qui exigent qu'il soit non statique?la source
Il y a déjà de bonnes réponses avec des explications sur les raisons pour lesquelles le mélange de la
Context
méthode non statiquegetText()
ne peut pas être utilisé avec votrestatic final String
.Une bonne question à poser est: pourquoi voulez-vous faire cela? Vous essayez de charger un à
String
partir de votrestrings
ressource et de renseigner sa valeur dans unpublic static
champ. Je suppose que c'est pour que certaines de vos autres classes puissent y accéder? Si tel est le cas, il n'est pas nécessaire de le faire. Au lieu de cela, passez unContext
à vos autres classes et appelez àcontext.getText(R.string.TTT)
partir d'eux.Et pour appeler cela depuis votre
Activity
:Cela vous permettra d'accéder à votre
String
ressource sans avoir besoin d'utiliser unpublic static
champ.la source
String a[] = context.getTextArray(R.array.myStringArray);
; cela, cependant, me donne une erreurThe method getTextArray(int) is undefined for the type Context
- pourquoi serait-il indéfini alors qu'il fonctionne avec getText?Context
n'a pas de méthode appeléegetTextArray
, mais agetText
. Peut-être pensez-vous àResources
qui agetTextArray
pour les autres qui trouvent cela dans la recherche:
J'obtiens souvent celui-ci lorsque j'appelle accidentellement une fonction en utilisant le nom de classe plutôt que le nom de l'objet. Cela se produit généralement parce que je leur donne des noms trop similaires: P
c'est à dire:
C'est évidemment une méthode statique. (bon pour quelque chose) Mais ce que je voulais vraiment faire (dans la plupart des cas l'était)
C'est une erreur tellement stupide, mais tous les deux mois, je perds environ 30 minutes à jouer avec les variables dans les définitions de "MyClass" pour déterminer ce que je fais mal alors qu'en réalité, c'est juste une faute de frappe.
Note amusante: le débordement de pile met en évidence la syntaxe pour rendre l'erreur vraiment évidente ici.
la source
Vous pouvez soit rendre votre variable non statique
ou rendre la méthode "getText" statique (si possible)
la source
getText est un membre de votre activité, il doit donc être appelé lorsque "this" existe. Votre variable statique est initialisée lorsque votre classe est chargée avant la création de votre activité.
Puisque vous souhaitez que la variable soit initialisée à partir d'une chaîne Resource, elle ne peut pas être statique. Si vous voulez qu'il soit statique, vous pouvez l'initialiser avec la valeur String.
la source
Vous ne pouvez pas faire référence à une variable statique à partir d'une méthode non statique. Pour comprendre cela, vous devez comprendre la différence entre statique et non statique.
Les variables statiques sont des variables de classe, elles appartiennent à la classe avec leur seule instance, créée à la première seulement. Les variables non statiques sont initialisées chaque fois que vous créez un objet de la classe.
Pour en venir à votre question, lorsque vous utilisez l'opérateur new (), nous créerons une copie de chaque fichier non statique pour chaque objet, mais ce n'est pas le cas pour les champs statiques. C'est pourquoi cela donne une erreur de compilation si vous référencez une variable statique à partir d'une méthode non statique.
la source
Cette question n'est pas nouvelle et les réponses existantes donnent une bonne base théorique. Je veux juste ajouter une réponse plus pragmatique.
getText est une méthode de la classe abstraite Context et pour l'appeler, il faut une instance de sa sous-classe (Activity, Service, Application ou autre). Le problème est que les variables finales statiques publiques sont initialisées avant la création de toute instance de Context.
Il existe plusieurs façons de résoudre ce problème:
la source