Estou tentando usar o método getResources em uma classe sem atividade. Como obtenho a referência ao objeto "resources" para que eu possa acessar o arquivo xml armazenado na pasta resources?
Exemplo:
XmlPullParser xpp = getResources().getXml(R.xml.samplexml);
Context
objetos no Android. Isso pode levar a vazamentos de memória. Veja minha resposta para uma solução menos arriscada.Respostas:
Você terá que passar um
context
objeto para ele. Outhis
se você tiver uma referência para a classe em um activty, ougetApplicationContext()
Então você pode usá-lo no construtor (ou configurá-lo como uma variável de instância):
Onde o construtor aceita
Context
como parâmetrofonte
Context
objetos no Android. Isso pode levar a vazamentos de memória.Context
os objetos são desagradáveis porque não é imediatamente óbvio se é para todo o aplicativo ou para toda a atividade. Vazamentos de memória (e falhas) ocorrem quando você fornece o incorreto. Por exemplo, fornecer umActivity
objeto estático que precise de umContext
objeto e não seja destruído quando oActivity
is leva àActivity
persistência após onDestroy, já que não pode ser GCed devido a esse outro objeto estático. Então, sim, pode ser perigoso, mas sabendo por que é perigoso, sinto que é importante mencionar aqui.Não é uma boa ideia passar
Context
objetos. Isso geralmente leva a vazamentos de memória. Minha sugestão é que você não faça isso. Criei vários aplicativos Android sem precisar passar o contexto para classes de não atividade no aplicativo. Uma idéia melhor seria obter os recursos aos quais você precisa acessar enquanto estiver noActivity
ouFragment
, e segurá-lo em outra classe. Você pode usar essa classe em qualquer outra classe em seu aplicativo para acessar os recursos, sem precisar passarContext
objetos.fonte
Há mais uma maneira de criar um objeto também. Verifique a referência . Obrigado por @cristian. Abaixo, adiciono as etapas mencionadas na referência acima. Para mim, não gosto de criar um objeto para isso e acessar. Então, eu tentei acessar o
getResources()
sem criar um objeto. Encontrei este post. Então, pensei em adicioná-lo como resposta.Siga as etapas para acessar
getResources()
em uma classe sem atividadewithout passing a context
por meio do objetoApplication
, por exemplopublic class App extends Application {
. Consulte o código ao lado das etapas.android:name
atributo da sua<application>
tag noAndroidManifest.xml
para apontar para sua nova classe, por exemploandroid:name=".App"
onCreate()
método da instância do aplicativo, salve o contexto (por exemplothis
) em um campo estático chamadoapp
e crie um método estático que retorne esse campo, por exemplogetContext()
.App.getContext()
sempre que quiser obter um contexto e, em seguida, podemos usarApp.getContext().getResources()
para obter valores dos recursos.É assim que deve parecer:
fonte
aqui está a minha resposta:
}
e a chamada pode ser assim:
fonte
isso pode ser feito usando
fonte
Context
objetos não é uma prática saudávelPodemos usar o contexto Como este, tente agora Onde o pai é o ViewGroup.
fonte
bem, não há necessidade de passar o contexto e fazer tudo isso ... simplesmente faça isso
Editar: onde pai é o ViewGroup
fonte
Isso sempre funciona para mim:
Não relacionado a esta pergunta, mas por exemplo, usando um fragmento para acessar recursos / atividades do sistema como este:
fonte
No aplicativo de guia turístico do curso Básico ANdroid da Udacity, usei o conceito de Fragmentos. Fiquei preso por um tempo com dificuldade para acessar alguns recursos de string descritos em strings, arquivo xml. Finalmente consegui uma solução.
Esta é a principal classe de atividade
pacote com.example.android.tourguidekolkata;
Esta é a classe non Activity que estende FragmentPageAdapter
fonte
Na classe simples, declare o contexto e obtenha dados do arquivo da pasta res
Na classe de atividade, declare assim
fonte
Estou atrasado, mas solução completa ;: Exemplo de Classe, Usar Contexto como este: -
Aviso (vazamentos de memória)
Como resolver isso?
Opção 1 : em vez de passar o contexto da atividade, isto é, para a classe singleton, você pode passar applicationContext ().
Opção 2: se você realmente precisar usar o contexto de atividade, quando a atividade for destruída, verifique se o contexto que você passou para a classe singleton está definido como nulo.
Espero que ajude ...
fonte
em sua MainActivity:
RecursosHelper:
então use-o em qualquer lugar
fonte