Я нашел R.string
довольно удивительным то, что я не могу использовать жестко запрограммированные строки в своем коде, и я хотел бы продолжать использовать его в служебном классе, который работает с моделями в моем приложении для генерации вывода. Например, в этом случае я генерирую электронное письмо из модели вне действия.
Можно ли использовать getString
снаружи Context
илиActivity
? Полагаю, я мог бы перейти к текущей деятельности, но это кажется ненужным. Пожалуйста, поправьте меня, если я ошибаюсь!
Изменить: Можем ли мы получить доступ к ресурсам без использования Context
?
java
android
string
android-resources
android-context
SapphireSun
источник
источник
Ответы:
Да, мы можем получить доступ к ресурсам, не используя `Context`
Ты можешь использовать:
... везде в вашем приложении, даже в объявлениях статических констант. К сожалению, он поддерживает только системные ресурсы .
Для локальных ресурсов используйте это решение . Это не тривиально, но работает.
источник
android.content.res.Resources$NotFoundException: String resource ID #0x7f0f0061
К сожалению, единственный способ получить доступ к любому из строковых ресурсов - с помощью
Context
(то естьActivity
илиService
). Что я обычно делал в этом случае, так это просто требовал, чтобы вызывающая сторона передавала контекст.источник
ctx.getString(ctx.R.string.blah);
Context
чтобы вы могли использовать его из Activity или Service.ctx.R.string.blah
, просто используйтеR.string.blah
symbol not found error
приходит, но убедитесь, что выR
импортировали в верхней части класса.В
MyApplication
который распространяетсяApplication
:В
MyApplication
хonCreate
:Теперь вы можете использовать это поле в любом месте вашего приложения.
источник
Кстати, одной из причин ошибки символа не может быть то, что ваша IDE импортировала android.R; класс вместо твоего. Просто измените импорт android.R; чтобы импортировать your.namespace.R;
Итак, 2 основных вещи, чтобы сделать строку видимой в другом классе:
источник
Уникальный подход
App.getRes().getString(R.string.some_id)
(1) Создайте или отредактируйте (если уже существует) свой
Application
класс.(2) Добавьте поле имени к вашему
manifest.xml
<application
тегу.Теперь вы готовы идти. Используйте в
App.getRes().getString(R.string.some_id)
любом месте приложения.источник
Если у вас есть класс, который вы используете в действии, и вы хотите иметь доступ к ресурсам в этом классе, я рекомендую вам определить контекст как частную переменную в классе и инициализировать его в конструкторе:
Сделайте мгновение класса в своей деятельности:
источник
Это должно дать вам доступ
applicationContext
из любого места, что позволит вам получить доступ к любомуapplicationContext
месту, которое может его использовать;Toast
,getString()
,sharedPreferences
И т.д.Синглтон:
Инициализируйте Singleton в своем
Application
подклассе:Если я не ошибаюсь, это дает вам
ApplicationContextSingleton.getInstance.getApplicationContext();
повод для приложенияContext повсюду, вызывайте его с помощью Вам не нужно очищать это в любой момент, так как когда приложение закрывается, это все равно идет с этим.Не забудьте обновить
AndroidManifest.xml
чтобы использовать этотApplication
подкласс:Пожалуйста, дайте мне знать, если вы видите здесь что-то не так, спасибо. :)
источник
Лучший подход из ответа Хемрая:
Класс приложения
Декларация в манифесте
Класс констант
С помощью
источник
Лучше использовать что-то подобное без контекста и активности :
источник
Каким-то образом не понравились хакерские решения для хранения статических значений, поэтому мы получили немного более длинную, но чистую версию, которая также может быть протестирована.
Найдены 2 возможных способа сделать это
например
Прежде чем читать: эта версия использует
Data binding
XML-
Деятельность / Fragment-
Иногда вам нужно изменить текст на основе поля в модели. Таким образом, вы бы также привязали данные к этой модели, и поскольку ваша деятельность / фрагмент знает о модели, вы можете очень легко получить значение и затем привязать данные к строке на основе этого.
источник
Вы можете сделать это в Kotlin , создав класс, расширяющий Application, а затем использовать его контекст для вызова ресурсов в любом месте вашего кода.
Ваш класс приложения будет выглядеть так
Объявите свой класс приложения в AndroidManifest.xml (очень важно)
Например, для доступа к строковому файлу используйте следующий код
источник
Вот что я сделал. В вашей MainActivity создайте статическую переменную для контекста, как показано ниже:
и в onCreate () инициализируйте mContext для этого;
Затем в файле, где вы хотите получить доступ к контексту, скажем,
Теперь вы можете получить строковый ресурс следующим образом,
источник
Я использовал
getContext().getApplicationContext().getString(R.string.nameOfString);
это работает для меня.источник
getContext()
, доступно везде ?!