Uważam, że jest to R.string
niesamowite, jeśli chodzi o trzymanie zakodowanych ciągów z dala od mojego kodu i chciałbym nadal używać go w klasie narzędzi, która współpracuje z modelami w mojej aplikacji do generowania danych wyjściowych. Na przykład w tym przypadku generuję wiadomość e-mail z modelu poza działaniem.
Czy można używać getString
poza Context
lubActivity
? Przypuszczam, że mógłbym przekazać obecną aktywność, ale wydaje się to niepotrzebne. Proszę popraw mnie jeżeli się mylę!
Edycja: Czy możemy uzyskać dostęp do zasobów bez użycia Context
?
java
android
string
android-resources
android-context
SapphireSun
źródło
źródło
Odpowiedzi:
Tak, możemy uzyskać dostęp do zasobów bez użycia „Kontekstu”
Możesz użyć:
... wszędzie w twojej aplikacji, nawet w deklaracjach stałych statycznych. Niestety obsługuje tylko zasoby systemowe .
W przypadku zasobów lokalnych skorzystaj z tego rozwiązania . To nie jest trywialne, ale działa.
źródło
android.content.res.Resources$NotFoundException: String resource ID #0x7f0f0061
Niestety, jedynym sposobem na uzyskanie dostępu do któregokolwiek z ciągów znaków jest
Context
użycie znaku (tj.Activity
LubService
). To, co zwykle robiłem w tym przypadku, to po prostu wymagać od dzwoniącego przekazania w kontekście.źródło
ctx.getString(ctx.R.string.blah);
Context
use, abyś mógł użyć go z działania lub usługi.ctx.R.string.blah
, po prostu użyjR.string.blah
symbol not found error
pochodzi, ale upewnij się, żeR
zaimportowałeś na szczycie klasy.W
MyApplication
, która rozciąga sięApplication
:W
MyApplication
„sonCreate
:Teraz możesz używać tego pola z dowolnego miejsca w aplikacji.
źródło
BTW, jednym z powodów błędu nie znaleziono symbolu może być to, że IDE zaimportował android.R; klasa zamiast twojej. Wystarczy zmienić import android.R; aby zaimportować twoją.namespace.R;
Więc 2 podstawowe rzeczy, aby łańcuch był widoczny w innej klasie:
źródło
Unikalne podejście
App.getRes().getString(R.string.some_id)
(1) Utwórz lub edytuj (jeśli już istnieje) swoją
Application
klasę.(2) Dodaj pole nazwy do
manifest.xml
<application
tagu.Teraz możesz już iść. Używaj w
App.getRes().getString(R.string.some_id)
dowolnym miejscu w aplikacji.źródło
Jeśli masz klasę, której używasz w działaniu i chcesz mieć dostęp do zasobu w tej klasie, zalecam zdefiniowanie kontekstu jako zmiennej prywatnej w klasie i zainicjowanie go w konstruktorze:
Chwila lekcji w swojej działalności:
źródło
Powinno to zapewnić Ci dostęp
applicationContext
z dowolnego miejsca, umożliwiając dostęp do dowolnegoapplicationContext
miejsca, w którym można z niego korzystać;Toast
,getString()
,sharedPreferences
, Itd.The Singleton:
Zainicjuj Singleton w swojej
Application
podklasie:Jeśli się nie mylę, daje to haczyk do aplikacji Kontekst wszędzie, zadzwoń z nim
ApplicationContextSingleton.getInstance.getApplicationContext();
Nie musisz tego usuwać w żadnym momencie, ponieważ kiedy aplikacja się zamyka, to i tak się dzieje.Pamiętaj o aktualizacji,
AndroidManifest.xml
aby użyć tejApplication
podklasy:Daj mi znać, jeśli zauważysz coś nie tak, dziękuję. :)
źródło
Najlepsze podejście z odpowiedzi Khemraj:
Klasa aplikacji
Deklaracja w manifeście
Klasa stałych
Za pomocą
źródło
Lepiej jest użyć czegoś takiego bez kontekstu i aktywności :
źródło
Jakoś nie podobały się pospieszne rozwiązania przechowywania wartości statycznych, więc wymyśliłem nieco dłuższą, ale czystą wersję, którą również można przetestować.
Znaleziono 2 możliwe sposoby, aby to zrobić-
na przykład
Zanim przeczytasz: Ta wersja używa
Data binding
XML-
Aktywność / fragment
Czasami musisz zmienić tekst na podstawie pola w modelu. Więc powiążesz również ten model, a ponieważ twoja aktywność / fragment wie o modelu, możesz bardzo dobrze pobrać wartość, a następnie powiązać dane na podstawie tego łańcucha.
źródło
Możesz to zrobić w Kotlinie , tworząc klasę rozszerzającą aplikację, a następnie wykorzystując jej kontekst do wywoływania zasobów w dowolnym miejscu w kodzie
Twoja klasa aplikacji będzie wyglądać tak
Zadeklaruj klasę aplikacji w AndroidManifest.xml (bardzo ważne)
Aby uzyskać dostęp np. Do pliku ciągów, użyj następującego kodu
źródło
Oto, co zrobiłem: w swojej MainActivity utwórz zmienną statyczną dla kontekstu, jak pokazano poniżej:
oraz w onCreate () zainicjuj mContext do tego;
Następnie w pliku, w którym chcesz uzyskać dostęp do kontekstu, powiedz:
Teraz możesz uzyskać zasób łańcucha w następujący sposób:
źródło
Użyłem
getContext().getApplicationContext().getString(R.string.nameOfString);
To działa dla mnie.źródło
getContext()
jest dostępny wszędzie ?!