Quero ler seqüências de caracteres de um xml
arquivo antes de fazer qualquer outra coisa como setText
nos widgets, então como posso fazer isso sem um objeto de atividade para chamar getResources()
?
168
Application
, por exemplopublic class App extends Application {
android:name
atributo da sua <application>
tag no AndroidManifest.xml
para apontar para sua nova classe, por exemploandroid:name=".App"
onCreate()
método da instância do aplicativo, salve o contexto (por exemplo this
) em um campo estático chamado mContext
e crie um método estático que retorne esse campo, por exemplo getContext()
:É assim que deve parecer:
public class App extends Application{
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static Context getContext(){
return mContext;
}
}
Agora você pode usar: App.getContext()
sempre que quiser obter um contexto e, em seguida getResources()
(ou App.getContext().getResources()
).
Apenas para recursos do sistema!
Usar
Você pode usá-los em qualquer lugar do seu aplicativo, mesmo em declarações de constantes estáticas!
fonte
Toast
instância, obter umaSharedPreference
instância, abrir um banco de dados, como meu professor de língua latina diz: et cetera ).Minha solução Kotlin é usar um contexto de aplicativo estático:
E a classe Strings, que eu uso em qualquer lugar:
Assim, você pode ter uma maneira limpa de obter cadeias de recursos
Por favor, não apague esta resposta, deixe-me manter uma.
fonte
Strings
foi útil.Há também outra possibilidade. Eu carrego os shaders OpenGl a partir de recursos como este:
Como você pode ver, você pode acessar qualquer recurso no caminho
/res/...
ChangeaClass
para sua classe. Também é assim que eu carrego recursos em testes (androidTests)fonte
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:Agora você deve poder usar ApplicationContextSingleton.getInstance (). GetApplicationContext (). GetResources () de qualquer lugar, também os poucos lugares em que as subclasses de aplicativos não podem.
Avise-me se vir algo errado aqui, obrigado. :)
fonte
Outra solução:
Se você tiver uma subclasse estática em uma classe externa não estática, poderá acessar os recursos de dentro da subclasse por meio de variáveis estáticas na classe externa, que você inicializa na criação da classe externa. Gostar
Usei-o para a função getPageTitle (int position) do FragmentPagerAdapter estático em meu FragmentActivity, útil por causa do I8N.
fonte
Atalho
Eu uso em
App.getRes()
vez deApp.getContext().getResources()
(como @ Cristian respondeu)É muito simples de usar em qualquer lugar do seu código!
Então, aqui está uma solução exclusiva pela qual você pode acessar recursos de qualquer lugar
Util class
.(1) Crie ou edite sua
Application
turma.(2) Adicione um campo de nome à sua
manifest.xml
<application
tag. (ou Ignore se já estiver lá)Agora você está pronto para ir.
Use
App.getRes().getString(R.string.some_id)
em qualquer lugar no código.fonte
Eu acho, de mais maneira é possível. Mas, às vezes, estou usando esta solução. (global completo):
fonte
Eu carrego o shader para o openGL ES a partir da função estática.
Lembre-se de que você deve usar letras minúsculas para o nome do arquivo e diretório, caso contrário a operação falhará
fonte
fonte
Estou usando o nível 27 da API e encontrei a melhor solução depois de lutar por cerca de dois dias. Se você deseja ler um arquivo xml de uma classe que não deriva de Activity ou Application, faça o seguinte.
Coloque o arquivo testdata.xml no diretório de ativos.
Escreva o código a seguir para obter o documento testdata analisado.
fonte
Na sua classe, onde você implementa a função estática , você pode chamar um método private \ public dessa classe. O método private \ public pode acessar os getResources .
por exemplo:
e de outra classe \ atividade, você pode chamar:
fonte
se você tem um contexto, quero dizer por dentro;
você pode usar este código para obter recursos:
fonte