Próbuję użyć metody getResources w klasie niebędącej aktywnością. Jak uzyskać odwołanie do obiektu „resources”, aby uzyskać dostęp do pliku xml przechowywanego w folderze zasobów?
Przykład:
XmlPullParser xpp = getResources().getXml(R.xml.samplexml);
Context
obiektów w systemie Android. Może to prowadzić do wycieków pamięci. Zobacz moją odpowiedź na mniej ryzykowne rozwiązanie.Odpowiedzi:
Będziesz musiał przekazać mu
context
przedmiot. Albothis
jeśli masz odniesienie do klasy w zajęciach, albogetApplicationContext()
Następnie możesz użyć go w konstruktorze (lub ustawić na zmienną instancji):
Gdzie konstruktor akceptuje
Context
jako parametrźródło
Context
obiektów w systemie Android. Może to prowadzić do wycieków pamięci.Context
obiekty są nieprzyjemne, ponieważ nie jest od razu oczywiste, czy obejmują one całą aplikację, czy działanie. Wycieki pamięci (i awarie) występują, gdy podasz niewłaściwy. Na przykład dostarczenie anActivity
do obiektu statycznego, który wymaga obiektu a,Context
a wspomniany obiekt nie jest niszczone, gdyActivity
prowadzi doActivity
utrwalenia po onDestroy, ponieważ nie można go GCed z powodu tego innego statycznego obiektu. Więc tak, może to być niebezpieczne, ale czuję , że wiedząc, dlaczego jest to niebezpieczne, warto tutaj wspomnieć.Przekazywanie przedmiotów nie jest dobrym pomysłem
Context
. To często prowadzi do wycieków pamięci. Moja sugestia jest taka, że tego nie robisz. Zrobiłem wiele aplikacji na Androida bez konieczności przekazywania kontekstu klasom niezwiązanym z aktywnością w aplikacji. Lepszym pomysłem byłoby zdobycie zasobów, do których potrzebujesz dostępu, gdy jesteś wActivity
lubFragment
, i trzymanie ich w innej klasie. Następnie możesz użyć tej klasy w innych klasach w aplikacji, aby uzyskać dostęp do zasobów bez konieczności przekazywaniaContext
obiektów.źródło
Jest jeszcze jeden sposób bez tworzenia obiektu. Sprawdź odniesienie . Dzięki za @cristian. Poniżej dodaję kroki, które wspomniałem w powyższym odnośniku. Ja nie lubię tworzyć obiektu do tego i dostępu. Więc próbowałem uzyskać dostęp do
getResources()
bez tworzenia obiektu. Znalazłem ten post. Pomyślałem więc o dodaniu tego jako odpowiedzi.Postępuj zgodnie z instrukcjami, aby uzyskać dostęp
getResources()
do klasy niebędącej działaniemwithout passing a context
za pośrednictwem obiektu.Application
, na przykładpublic class App extends Application {
. Zapoznaj się z kodem obok kroków.android:name
atrybut swojego<application>
tagu w,AndroidManifest.xml
aby wskazywał na twoją nową klasę, npandroid:name=".App"
onCreate()
metodzie Twojej instancji aplikacji zapisz kontekst (np.this
) W statycznym polu o nazwieapp
i utwórz statyczną metodę, która zwraca to pole, npgetContext()
.App.getContext()
kiedy chcesz uzyskać kontekst, a następnie możemy użyćApp.getContext().getResources()
do pobrania wartości z zasobów.Tak to powinno wyglądać:
źródło
oto moja odpowiedź:
}
a wezwanie może wyglądać tak:
źródło
można to zrobić za pomocą
źródło
Context
przedmiotów nie jest zdrową praktykąMożemy użyć kontekstu Tak jak teraz, spróbuj teraz Gdzie rodzicem jest ViewGroup.
źródło
no cóż, nie ma potrzeby przekazywania kontekstu i robienia tego wszystkiego ... po prostu zrób to
Edycja: gdzie rodzic jest ViewGroup
źródło
To zawsze działa dla mnie:
Nie ma związku z tym pytaniem, ale przykład użycia fragmentu do uzyskania dostępu do zasobów / działań systemowych, takich jak:
źródło
W aplikacji przewodnika kursu Basic ANdroid Udacity wykorzystałem koncepcję fragmentów. Utknąłem na chwilę, mając trudności z dostępem do niektórych zasobów ciągu opisanych w ciągach znaków, pliku xml. Wreszcie znalazłem rozwiązanie.
To jest główna klasa aktywności
pakiet com.example.android.tourguidekolkata;
To jest klasa non Activity, która rozszerza FragmentPageAdapter
źródło
W prostej klasie zadeklaruj kontekst i pobierz dane z pliku z folderu res
W klasie aktywności zadeklaruj w ten sposób
źródło
Jestem spóźniony, ale kompletne rozwiązanie;: Przykładowa klasa, użyj kontekstu w następujący sposób: -
Ostrzeżenie (wycieki pamięci)
Jak to rozwiązać?
Opcja 1 : Zamiast przekazywać kontekst działania, czyli to do klasy pojedynczej, możesz przekazać applicationContext ().
Opcja 2: Jeśli naprawdę musisz użyć kontekstu działania, po zniszczeniu działania upewnij się, że kontekst przekazany do klasy pojedynczej ma wartość null.
Mam nadzieję, że to pomoże… ∆∆∆∆
źródło
w Twojej MainActivity:
ZasobyHelper:
następnie używaj go wszędzie
źródło