Доступ к ресурсам без контекста
Я пытаюсь установить конфигурацию, такую как URL/etc, в папку ресурса для используемого класса утилиты. Тем не менее, я не хочу передавать Контекст из всей деятельности. Я хотел бы иметь доступ к ресурсу с помощью имени пути (похоже, для этого было использовано свойство /), без использования контекста для доступа к ресурсу.
В этом конкретном случае я хочу, чтобы singleton использовал что-то в конфигурации при его создании. Он не нуждается ни в чем из ресурсов помимо того, что один раз во время создания экземпляра. Следовательно, при переходе в контекст каждый раз, когда вызывается getInstance(), это будет полная потеря.
Кроме того, это специфично для конфигурации приложения и не должно храниться в общем системном файле или что-то в этом роде.
Ответы
Ответ 1
Использование
Resources.getSystem().getString(android.R.string.someuniversalstuff)
Вы можете использовать его абсолютно в любом месте в своем приложении, даже в объявлении статических констант! Но только для системных ресурсов.
Для локальных ресурсов используйте это решение.
Ответ 2
Вы можете расширить основной класс приложения и предоставить универсальные помощники для доступа к ресурсам. Это избавляет от необходимости контекста, поскольку приложение будет предоставлять контекст вместо вызывающего. Класс приложения является одноточечным и всегда должен быть доступен, пока какая-либо часть вашего приложения работает (включая службы).
public class MyApplication extends Application {
protected static MyApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public static Resources getResources() {
return instance.getResources();
}
}
Это дает вам доступ к:
MyApplication.getResources()....
Обязательно объявите свое пользовательское приложение в своем манифесте, чтобы получить доступ к этому. Предполагая, что ваше пользовательское приложение находится в корневом пространстве вашего приложения:
<application
android:name=".MyApplication"
... >
Ответ 3
К сожалению, я не думаю, что вокруг этого есть реальный путь. Я выложил что-то вроде этого, а также передал getApplicationContext() вместо контекста активности.
public static AppController getAppController(Context context){
if(self == null) {
//Create instance
self = new AppController();
}
return self;
}
И затем:
appController = AppController.getAppController(getApplicationContext());
Ответ 4
Я бы рекомендовал сделать следующее:
Вместо того, чтобы передавать контекст везде, сделайте свой класс активности одиночным классом с публичной функцией, которая возвращает контекст:
private static ActivityMain instance;
Инициализировать внутри onCreate() перед super.onCreate():
instance = this;
Затем добавьте эти публичные функции в свою деятельность:
/** Get singleton instance of activity **/
public static ActivityMain getInstance() {
return instance;
}
/** Returns context of this activity **/
public static Context getContext(){
return instance.getApplicationContext();
}
Теперь вы можете использовать следующее в любом классе:
Context context = AntiMorphActivity.getContext();
String packageName = context.getPackageName();
int id = context.getResources().getIdentifier("web_page", "raw", packageName);
Ответ 5
Ответ на stackoverflow на вопрос ниже показывает, как использовать POJO для получения потока на ресурс, если вы укажете его путь. Это может быть полезно в случаях, когда вам нужно выбрать конкретный ресурс из одного из многих.
Возможно ли прочитать сырой текстовый файл без ссылки на Контекст в проекте библиотеки Android