Доступ к ресурсам без контекста - PullRequest
23 голосов
/ 07 апреля 2011

Я пытаюсь поместить конфигурацию, такую ​​как URL / etc, в папку ресурсов для использования служебным классом.Тем не менее, я не хочу передавать контекст из деятельности везде.Я хотел бы иметь возможность получить доступ к ресурсу через имя пути (кажется, что активы / были разработаны для этого использования), без использования контекста для доступа к ресурсу.

В данном конкретном случае я хочу синглтониспользовать что-то в конфигурации, когда он создан.Он не нуждается ни в чем из ресурсов, кроме этого один раз во время реализации.Следовательно, необходимость передавать в Context каждый раз, когда вызывается getInstance (), будет полной тратой.

Кроме того, это зависит от конфигурации приложения и не должно храниться в общем системном файле или чем-либо еще.вот так.

Ответы [ 5 ]

74 голосов
/ 07 января 2012

Используйте

Resources.getSystem().getString(android.R.string.someuniversalstuff)

Вы можете использовать его АБСОЛЮТНО ВЕЗДЕ в вашем приложении, даже в объявлении статических констант! Но только для системных ресурсов .

Для локальных ресурсов используйте это решение .

14 голосов
/ 06 ноября 2012

Вы можете расширить основной класс приложения и предоставить универсальные помощники для доступа к ресурсам.Это устраняет необходимость в контексте, поскольку приложение будет предоставлять контекст вместо вызывающей стороны.Класс приложения имеет одноэлементный стиль и всегда должен быть доступен во время работы любой части вашего приложения (включая службы).

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"
 ... >
1 голос
/ 17 августа 2012

Я бы порекомендовал сделать следующее: Вместо того, чтобы передавать контекст повсеместно, сделайте ваш класс активности одноэлементным классом с публичной функцией, которая возвращает контекст:

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);
1 голос
/ 07 апреля 2011

К сожалению, я не думаю, что есть реальный способ обойти это.Я выкладываю что-то вроде этого, а также передаю getApplicationContext () вместо контекста активности.

public static AppController getAppController(Context context){
    if(self == null) {
        //Create instance
        self = new AppController();
    }

    return self;
}

А затем:

appController = AppController.getAppController(getApplicationContext());
0 голосов
/ 03 ноября 2014

Ответ stackoverflow на вопрос ниже показывает, как использовать POJO для получения потока к ресурсу, если вы указываете его путь. Это может быть полезно в тех случаях, когда вам нужно выбрать определенный ресурс из одного из многих.

Можно ли читать необработанный текстовый файл без ссылки на контекст в проекте библиотеки Android

...