Construyendo una aplicación multi-lenguaje en Java. Obteniendo un error al insertar un valor de cadena desde el R.string
archivo XML de recursos:
public static final String TTT = (String) getText(R.string.TTT);
Este es el mensaje de error:
Error: no se puede hacer una referencia estática al método no estático getText (int) desde el tipo Context
¿Cómo se produce esto y cómo puedo solucionarlo?
java
compiler-errors
static-methods
Chen M
fuente
fuente
getString()
cuando los necesite. De esa manera, su aplicación se ajusta correctamente a los usuarios que cambian el idioma elegido.Respuestas:
Dado
getText()
que no es estático, no puede llamarlo desde un método estático.Para entender por qué, debes entender la diferencia entre los dos.
Los métodos de instancia (no estáticos) funcionan en objetos que son de un tipo particular (la clase). Estos se crean con lo nuevo así:
Para llamar a un método de instancia, lo llama en la instancia (
myObject
):Sin embargo, solo se puede llamar a un método / campo estático en el tipo directamente, digamos así:La declaración anterior no es correcta. También se puede hacer referencia a campos estáticos con una referencia de objeto como,myObject.staticMethod()
pero esto no se recomienda porque no deja en claro que son variables de clase.Y los dos no pueden trabajar juntos ya que operan en diferentes espacios de datos (datos de instancia y datos de clase)
Déjame intentar explicarte. Considere esta clase (psuedocode):
Ahora tengo el siguiente caso de uso:
¿Cuáles son los valores?
Bien
En otras palabras,
TTT
es un dato compartido por todas las instancias del tipo. Entonces no tiene sentido decirEntonces, la pregunta es ¿por qué TTT es estático o por qué getText () no es estático?
Quite el
static
y debería superar este error, pero sin entender qué hace su tipo, es solo un yeso pegajoso hasta el siguiente error. ¿Cuáles son los requisitosgetText()
que requieren que sea no estático?fuente
Ya hay algunas buenas respuestas con explicaciones de por qué la combinación del
Context
métodogetText()
no estático no se puede usar con sustatic final String
.Una buena pregunta es: ¿por qué quieres hacer esto? Está intentando cargar un
String
desde sustrings
recurso y completar su valor en unpublic static
campo. Supongo que esto es para que algunas de sus otras clases puedan acceder a él. Si es así, no es necesario hacer esto. En su lugar, pase unContext
a sus otras clases y llamecontext.getText(R.string.TTT)
desde dentro de ellas.Y para llamar a esto desde tu
Activity
:Esto le permitirá acceder a su
String
recurso sin necesidad de utilizar unpublic static
campo.fuente
String a[] = context.getTextArray(R.array.myStringArray);
; sin embargo, me da un errorThe method getTextArray(int) is undefined for the type Context
: ¿por qué estaría indefinido mientras funciona con getText?Context
no tiene un método llamadogetTextArray
, pero tienegetText
. Quizás estés pensando enResources
cuál tienegetTextArray
para otros que encuentran esto en la búsqueda:
A menudo obtengo este cuando llamo accidentalmente a una función usando el nombre de la clase en lugar del nombre del objeto. Esto suele suceder porque les doy nombres demasiado similares: P
es decir:
Obviamente, este es un método estático. (bueno para algunas cosas) Pero lo que realmente quería hacer (en la mayoría de los casos era)
Es un error tan tonto, pero cada dos meses, pierdo unos 30 minutos jugando con vars en las definiciones de "MyClass" para averiguar qué estoy haciendo mal cuando en realidad es solo un error tipográfico.
Nota divertida: el desbordamiento de pila resalta la sintaxis para que el error sea realmente obvio aquí.
fuente
Puede hacer que su variable no sea estática
o hacer que el método "getText" sea estático (si es posible)
fuente
getText es miembro de your Activity, por lo que debe llamarse cuando "this" existe. Su variable estática se inicializa cuando su clase se carga antes de que se cree su Actividad.
Dado que desea que la variable se inicialice desde una cadena de recursos, entonces no puede ser estática. Si desea que sea estático, puede inicializarlo con el valor String.
fuente
No puede hacer referencia a una variable estática desde un método no estático. Para comprender esto, debe comprender la diferencia entre estático y no estático.
Las variables estáticas son variables de clase, pertenecen a la clase con su única instancia, creada solo en la primera. Las variables no estáticas se inicializan cada vez que crea un objeto de la clase.
Ahora, llegando a su pregunta, cuando use el operador new (), crearemos una copia de cada archivo no estático para cada objeto, pero no es el caso de los campos estáticos. Es por eso que da un error de tiempo de compilación si está haciendo referencia a una variable estática de un método no estático.
fuente
Esta pregunta no es nueva y las respuestas existentes proporcionan una buena base teórica. Solo quiero agregar una respuesta más pragmática.
getText es un método de la clase abstracta Context y para llamarlo, se necesita una instancia de su subclase (Actividad, Servicio, Aplicación u otra). El problema es que las variables finales estáticas públicas se inicializan antes de que se cree cualquier instancia de Context.
Hay varias formas de solucionar esto:
fuente