Chcę odczytać ciągi z xml
pliku, zanim zrobię coś innego, jak setText
na widżetach, więc jak mogę to zrobić bez obiektu aktywności do wywołaniagetResources()
?
168
Application
, na przykładpublic class App extends Application {
android:name
atrybut swojego <application>
tagu w, AndroidManifest.xml
aby wskazywał na twoją nową klasę, npandroid:name=".App"
onCreate()
metodzie instancji aplikacji zapisz kontekst (np. this
) W statycznym polu o nazwie mContext
i utwórz statyczną metodę, która zwraca to pole, np . getContext()
:Tak to powinno wyglądać:
public class App extends Application{
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static Context getContext(){
return mContext;
}
}
Teraz możesz użyć: App.getContext()
kiedy chcesz uzyskać kontekst, a następnie getResources()
(lub App.getContext().getResources()
).
Tylko dla zasobów systemowych!
Posługiwać się
Możesz ich używać wszędzie w swojej aplikacji, nawet w deklaracjach stałych statycznych!
źródło
Toast
na przykład, uzyskanieSharedPreference
instancji, otwarcie bazy danych, jak mówi mój nauczyciel języka łacińskiego: i tak dalej ).Moje rozwiązanie Kotlin polega na użyciu statycznego kontekstu aplikacji:
I klasa Strings, której używam wszędzie:
Możesz więc mieć czysty sposób uzyskiwania ciągów zasobów
Proszę, nie usuwaj tej odpowiedzi, pozwól mi ją zachować.
źródło
Strings
było pomocne.Jest też inna możliwość. Ładuję shadery OpenGl z takich zasobów:
Jak widać, możesz uzyskać dostęp do dowolnego zasobu w ścieżce
/res/...
ZmieńaClass
do swojej klasy. Tak też ładuję zasoby w testach (androidTests)źródło
Singleton:
Zainicjuj Singleton w swojej
Application
podklasie:Jeśli się nie mylę, to daje ci to podpięcie do applicationContext wszędzie, wywołuj to za pomocą.
ApplicationContextSingleton.getInstance.getApplicationContext();
Nie powinieneś tego czyścić w żadnym momencie, ponieważ kiedy aplikacja się zamyka, to i tak się z tym wiąże.Pamiętaj o aktualizacji,
AndroidManifest.xml
aby używać tejApplication
podklasy:Teraz powinno być możliwe użycie ApplicationContextSingleton.getInstance (). GetApplicationContext (). GetResources () z dowolnego miejsca, także z bardzo niewielu miejsc, w których podklasy aplikacji nie mogą.
Daj mi znać, jeśli zauważysz coś nie tak, dziękuję. :)
źródło
Inne rozwiązanie:
Jeśli masz statyczną podklasę w niestatycznej klasie zewnętrznej, możesz uzyskać dostęp do zasobów z podklasy poprzez statyczne zmienne w klasie zewnętrznej, które są inicjowane podczas tworzenia klasy zewnętrznej. Lubić
Użyłem go dla funkcji getPageTitle (pozycja int) statycznego FragmentPagerAdapter w ramach mojej FragmentActivity, która jest przydatna ze względu na I8N.
źródło
Skrót
Używam
App.getRes()
zamiastApp.getContext().getResources()
(jak odpowiedział @Cristian)Jest bardzo prosty w użyciu w dowolnym miejscu w kodzie!
Oto wyjątkowe rozwiązanie, dzięki któremu możesz uzyskać dostęp do zasobów z dowolnego miejsca, na przykład
Util class
.(1) Utwórz lub edytuj swoją
Application
klasę.(2) Dodaj pole nazwy do swojego
manifest.xml
<application
tagu. (lub Pomiń to, jeśli już tam jest)Teraz możesz już iść.
Używaj w
App.getRes().getString(R.string.some_id)
dowolnym miejscu kodu.źródło
Myślę, że jest więcej możliwości. Ale czasami korzystam z tego rozwiązania. (pełne dane globalne):
źródło
Ładuję moduł cieniujący dla openGL ES z funkcji statycznej.
Pamiętaj, że w nazwie pliku i katalogu musisz używać małych liter, w przeciwnym razie operacja się nie powiedzie
źródło
źródło
Używam API poziomu 27 i znalazłem najlepsze rozwiązanie po zmaganiach przez około dwa dni. Jeśli chcesz odczytać plik xml z klasy, która nie pochodzi od Activity lub Application, wykonaj następujące czynności.
Umieść plik testdata.xml w katalogu zasobów.
Napisz poniższy kod, aby uzyskać przeanalizowany dokument testdata.
źródło
W swojej klasie, w której implementujesz funkcję statyczną , możesz wywołać metodę private \ public z tej klasy. Metoda private \ public może uzyskać dostęp do getResources .
na przykład:
az innych zajęć możesz zadzwonić:
źródło
jeśli masz kontekst, mam na myśli wnętrze;
możesz użyć tego kodu, aby uzyskać zasoby:
źródło