Construindo um aplicativo multilíngue em Java. Obtendo um erro ao inserir o valor String do R.string
arquivo XML de recurso:
public static final String TTT = (String) getText(R.string.TTT);
Esta é a mensagem de erro:
Erro: não é possível fazer uma referência estática ao método não estático getText (int) do tipo Context
Como isso é causado e como posso resolver isso?
java
compiler-errors
static-methods
Chen M
fonte
fonte
getString()
quando precisar deles. Dessa forma, seu aplicativo se ajusta adequadamente aos usuários que mudam o idioma escolhido.Respostas:
Como
getText()
não é estático, você não pode chamá-lo de um método estático.Para entender o porquê, você precisa entender a diferença entre os dois.
Métodos de instância (não estáticos) funcionam em objetos que são de um tipo específico (a classe). Eles são criados com o novo assim:
Para chamar um método de instância, você o chama na instância (
myObject
):No entanto, um método / campo estático pode ser chamado apenas no tipo diretamente, digamos assim:A declaração anterior não está correta. Também se pode referir a campos estáticos com uma referência de objeto como,myObject.staticMethod()
mas isso é desencorajado porque não deixa claro que são variáveis de classe.E os dois não podem trabalhar juntos, pois operam em espaços de dados diferentes (dados de instância e dados de classe)
Deixe-me tentar explicar. Considere esta classe (psuedocode):
Agora tenho o seguinte caso de uso:
Quais são os valores?
Bem
Em outras palavras,
TTT
é um dado compartilhado por todas as instâncias do tipo. Então não faz sentido dizerPortanto, a questão é por que o TTT é estático ou por que getText () não é estático?
Remova o
static
e ele deve passar por esse erro - mas sem entender o que seu tipo faz é apenas um esparadrapo até o próximo erro. Quais são os requisitosgetText()
que exigem que seja não estático?fonte
Já existem algumas boas respostas com explicações de porque a mistura do
Context
métodogetText()
não estático não pode ser usado com o seustatic final String
.Uma boa pergunta a fazer é: por que você quer fazer isso? Você está tentando carregar um
String
de seustrings
recurso e preencher seu valor em umpublic static
campo. Presumo que seja para que algumas de suas outras classes possam acessá-lo. Nesse caso, não há necessidade de fazer isso. Em vez disso, passe umContext
para suas outras classes e chamecontext.getText(R.string.TTT)
de dentro delas.E para chamar isso de seu
Activity
:Isso permitirá que você acesse seu
String
recurso sem precisar usar umpublic static
campo.fonte
String a[] = context.getTextArray(R.array.myStringArray);
; ele, entretanto, me dá um erroThe method getTextArray(int) is undefined for the type Context
- por que seria indefinido enquanto funciona com getText?Context
não tem um método chamadogetTextArray
, mas temgetText
. Talvez você esteja pensando emResources
qual temgetTextArray
para outros que encontram isso na pesquisa:
Freqüentemente recebo este quando acidentalmente chamo uma função usando o nome da classe em vez do nome do objeto. Isso geralmente acontece porque eu dou nomes muito semelhantes: P
ie:
Este é obviamente um método estático. (bom para algumas coisas) Mas o que eu realmente queria fazer (na maioria dos casos era)
É um erro tão bobo, mas a cada dois meses, eu perco cerca de 30 minutos mexendo com vars nas definições "MyClass" para descobrir o que estou fazendo de errado quando, na verdade, é apenas um erro de digitação.
Nota engraçada: o estouro de pilha destaca a sintaxe para tornar o erro realmente óbvio aqui.
fonte
Você pode tornar sua variável não estática
ou torne o método "getText" estático (se possível)
fonte
getText é membro da sua Activity, portanto, deve ser chamado quando "this" existir. Sua variável estática é inicializada quando sua classe é carregada antes de sua Activity ser criada.
Como você deseja que a variável seja inicializada a partir de uma string de Recurso, ela não pode ser estática. Se você quiser que seja estático, pode inicializá-lo com o valor String.
fonte
Você não pode fazer referência a uma variável estática de um método não estático. Para entender isso, você precisa entender a diferença entre estático e não estático.
Variáveis estáticas são variáveis de classe, pertencem à classe com sua única instância, criada apenas na primeira. Variáveis não estáticas são inicializadas sempre que você cria um objeto da classe.
Agora, voltando à sua pergunta, quando você usa o operador new (), criaremos uma cópia de cada campo não estático para cada objeto, mas não é o caso dos campos estáticos. É por isso que dá erro de tempo de compilação se você estiver referenciando uma variável estática de um método não estático.
fonte
Esta questão não é nova e as respostas existentes fornecem uma boa base teórica. Eu só quero adicionar uma resposta mais pragmática.
getText é um método da classe abstrata Context e para chamá-lo, é necessária uma instância de sua subclasse (Activity, Service, Application ou outro). O problema é que as variáveis finais estáticas públicas são inicializadas antes que qualquer instância de Context seja criada.
Existem várias maneiras de resolver isso:
fonte