Eu achei o R.string
incrível para manter as strings codificadas fora do meu código e gostaria de continuar usando-a em uma classe de utilitário que funciona com modelos no meu aplicativo para gerar saída. Por exemplo, neste caso, estou gerando um email de um modelo fora da atividade.
É possível usar getString
fora de um Context
ouActivity
? Suponho que poderia passar na atividade atual, mas parece desnecessário. Por favor me corrija se eu estiver errado!
Edit: Podemos acessar os recursos sem usar Context
?
java
android
string
android-resources
android-context
SapphireSun
fonte
fonte
Respostas:
Sim, podemos acessar recursos sem usar o `Contexto`
Você pode usar:
... em qualquer lugar do seu aplicativo, mesmo em declarações de constantes estáticas. Infelizmente, ele suporta apenas os recursos do sistema .
Para recursos locais, use esta solução . Não é trivial, mas funciona.
fonte
android.content.res.Resources$NotFoundException: String resource ID #0x7f0f0061
Infelizmente, a única maneira de acessar qualquer um dos recursos de string é com um
Context
(ou seja, umActivity
ouService
). O que geralmente faço neste caso é simplesmente exigir que o chamador passe no contexto.fonte
ctx.getString(ctx.R.string.blah);
Context
para que você possa usá-lo em uma Atividade ou em um Serviço.ctx.R.string.blah
, basta usarR.string.blah
symbol not found error
vem, mas verifique seR
importou na parte superior da classe.Em
MyApplication
, que se estendeApplication
:In
MyApplication
'sonCreate
:Agora você pode usar este campo de qualquer lugar no seu aplicativo.
fonte
Aliás, um dos motivos do erro de símbolo não encontrado pode ser que o seu IDE importou o android.R; classe em vez da sua. Basta alterar import android.R; para importar your.namespace.R;
Então, duas coisas básicas para obter a string visível nas diferentes classes:
fonte
Abordagem única
App.getRes().getString(R.string.some_id)
(1) Crie ou edite (se já existir) sua
Application
turma.(2) Adicione um campo de nome à sua
manifest.xml
<application
tag.Agora você está pronto para ir. Use
App.getRes().getString(R.string.some_id)
em qualquer lugar do aplicativo.fonte
Se você tem uma classe que você usa em uma atividade e deseja acessar o recurso nessa classe, recomendo que você defina um contexto como uma variável privada na classe e inicialize-a no construtor:
Fazendo um instante de aula em sua atividade:
fonte
Isso deve
applicationContext
permitir o acesso de qualquer lugar, permitindo chegar aapplicationContext
qualquer lugar que possa usá-lo;Toast
,getString()
,sharedPreferences
, Etc.O Singleton:
Inicialize o Singleton na sua
Application
subclasse:Se não estou errado, isso dá a você um gancho para o applicationContext em todos os lugares, chame-o com
ApplicationContextSingleton.getInstance.getApplicationContext();
Você não precisa limpar isso a qualquer momento, pois quando o aplicativo é fechado, isso também acontece com ele.Lembre-se de atualizar
AndroidManifest.xml
para usar estaApplication
subclasse:Avise-me se vir algo errado aqui, obrigado. :)
fonte
A melhor abordagem da resposta do Khemraj:
Classe de aplicativo
Declaração no manifesto
Classe de constantes
Usando
fonte
É melhor usar algo assim sem contexto e atividade :
fonte
De alguma forma, não gostou das soluções hacky de armazenamento de valores estáticos, por isso surgiu um pouco mais, mas uma versão limpa que também pode ser testada.
Foram encontradas 2 maneiras possíveis de fazer isso-
por exemplo
Antes de ler: Esta versão usa
Data binding
XML-
Atividade / Fragmento-
Às vezes, você precisa alterar o texto com base em um campo em um modelo. Portanto, você também vincularia dados a esse modelo e, como sua atividade / fragmento conhece o modelo, é possível buscar muito bem o valor e vincular a sequência com base nisso.
fonte
Você pode fazer isso no Kotlin , criando uma classe que estende o Application e use seu contexto para chamar os recursos em qualquer lugar do seu código
Sua turma de aplicativos ficará assim
Declare sua classe de aplicativo no AndroidManifest.xml (muito importante)
Para acessar, por exemplo, um arquivo de string, use o seguinte código
fonte
Aqui está o que eu fiz: Na sua MainActivity, crie uma variável estática para o contexto, como mostrado abaixo:
e no onCreate () inicialize o mContext para isso;
Em seguida, no arquivo em que você deseja acessar o contexto, diga:
Agora, você pode obter um recurso de string da seguinte maneira,
fonte
Eu usei
getContext().getApplicationContext().getString(R.string.nameOfString);
Funciona para mim.fonte
getContext()
está disponível em qualquer lugar ?!