Страница 1 из 1

Доступ к ресурсам из "свободных" классов

Добавлено: 24 фев 2014, 21:32
Ferz
Прошу прощения за ламерский вопрос, но так сложилось, что пришлось погружаться в разработку под android сразу, что называется "с головой"... Суть вопроса: есть у меня класс, назову его "свободным", имя в виду, что он не является наследником класса Activity (или других "андроидных" классов), так вот как в нем мне получить доступ к ресурсам, например к строковым? Я могу в коде мотодов данного класса получит идентификатор ресурса, например, R.strings.myName, но как мне по этому индентификатору получить саму строку? Т.е. если бы этот класс был наследником класса Activity, я бы вызвал метод getString(R.strings.myName)...

С уважением, Сергей.

P.S. Еще раз извиняюсь, если вопрос уже поднимался, а я его не нашел на форуме.

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 24 фев 2014, 22:23
KamiSempai
Нужно передавать в эти классы контекст. Обычно он запрашивается прямо в конструкторае.
За этим контекстом ходить далеко не нужно, сама активити я является наследником класса Context.
Ресурсы из контекста получаются так: context.getResources().getString(R.string.some_string)
Это для строк, для других видов ресурсов полно других методов.

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 25 фев 2014, 06:25
samodelkin
Доступ к ресурсам можно получит из активности, чтобы получить возможность обращаться к активности из любого класса, проще всего в главной активности создать статичную ссылку таким образом:
1)обьявить публичное статичное поле вот так: public static MainActivity link;
2)В методе onCreate, который находится в главной активности заполнить ссылку таким образом:
link=this;
пример:
...
public class MainActivity extends Activity{
public static MainActivity link;
public void onCreate(Bundle savedInstance){
link=this;
}
}

после этого обращаться из другого класса так:
MainActivity.link.getResources()...

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 25 фев 2014, 07:11
Foenix
samodelkin, вы что, кто вас учил так делать?

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 25 фев 2014, 09:00
rezak90
Foenix писал(а):samodelkin, вы что, кто вас учил так делать?
:D , так все делают... ты что не знала?! :o

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 25 фев 2014, 09:04
Foenix
с ума посходили..

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 25 фев 2014, 09:10
Mikhail_dev
Нужно передавать в эти классы контекст. Обычно он запрашивается прямо в конструкторае.
Ага, а потом получить Memory leak, либо еще что-то забавное при повороте экрана.

Самый, самый разумный тут способ, это сделать Singleton из класса, унаследованного от Application класса.

[syntax=java5]

public class App extends android.app.Application {
private static App singleton;

public static App getInstance() {
return singleton;
}

@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
}
[/syntax]
Далее мы просто пишем App.getInstance().getString(идентификатор_ресурса);
Если непонятно что за чудо такой класс этот Application, то можно погуглить. Он очень часто помогает во многих вещах.

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 25 фев 2014, 10:58
KamiSempai
m090050 писал(а):Самый, самый разумный тут способ, это сделать Singleton из класса, унаследованного от Application класса.
В итоге получаем жесткую зависимость нашего класса от класса аппликации. Для получения контекста аппликации можно воспользоваться getApplicationContext().

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 25 фев 2014, 11:14
altwin
SomeClass.java:
[syntax=java]
public class SomeClass {
private static Context context;

public static void setContext(Context mcontext) {
if (context == null)
context = mcontext;
}
}
[/syntax]
И MainActivity в методе onCreate:
[syntax=java]
SomeClass.setContext(getApplicationContext());
[/syntax]

P.S>Короче - оба правы частично ))), но это как варриант, вообще класс R и ипортировать можно.... :)

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 25 фев 2014, 17:43
Mikhail_dev
В итоге получаем жесткую зависимость нашего класса от класса аппликации.
В чем же будет выражена зависимость от класса? о_О Я ни малейшей зависимости не вижу в данном случае.
Для получения контекста аппликации можно воспользоваться getApplicationContext().
У классов НЕунаследованных от Context, вызвать подобный метод нельзя.

altwin, а нафига такой адов велосипед писать?

Вы в курсе, что рекомендуют к примеру инициализировать синглтоны в классе, унаследованном от Application? И елси в курсе, то почему это делать надо там?

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 25 фев 2014, 19:13
Ferz
Спасибо всем за ответы! ))) Буду разбираться и подбирать оптимальный вариант...

С уважением, Сергей.

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 25 фев 2014, 20:45
KamiSempai
m090050 писал(а):
В итоге получаем жесткую зависимость нашего класса от класса аппликации.
В чем же будет выражена зависимость от класса? о_О Я ни малейшей зависимости не вижу в данном случае.
В том, что класс будет привязан к определенному приложению, для использования его в другом месте понадобится изменять код на обращение к другому синглтону. А об использовании нескольких контекстов даже и думать не стоит.
m090050 писал(а):
Для получения контекста аппликации можно воспользоваться getApplicationContext().
У классов НЕунаследованных от Context, вызвать подобный метод нельзя.
Зато можно вызвать в активити и передать в свой класс.

Тут еще зависит от того где этот класс будет использоваться, если в рамках одной активити, можно просто брать контекст активности. Если это один класс на все приложение, лучше оформить его как синглтон с инициализацией в onCreate аппликации.
Суть тут одна, если класс использует ресурсы, передаем в него контекст. Если класс живет дольше чем сущьность его создавшая, это должен быть контекст активности.

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 25 фев 2014, 21:01
Mikhail_dev
В том, что класс будет привязан к определенному приложению, для использования его в другом месте понадобится изменять код на обращение к другому синглтону. А об использовании нескольких контекстов даже и думать не стоит.
Денис, ты ли это? К какому нафиг определенному приложению? :)

Re: Доступ к ресурсам из "свободных" классов

Добавлено: 07 янв 2021, 15:30
Sukaba
Подскажите, если можно:
Вот сделал как рекомендует altwin, но в моём "свободном" классе , где записано

Код: Выделить всё

private static Context context; // жёлтая метка на слове static
    public static void setContext(Context mcontext) {
        if (context == null)
            context = mcontext;
    }
Андроид Студия выдаёт жёлтое предупреждение (текст ниже). Всё, вроде работает, но "терзают смутные сомнения" - какая-такая утечка памяти ? Как это исправить можно?
текст предупреждения:
Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run) less... (Ctrl+F1)
A static field will leak contexts. Non-static inner classes have an implicit reference to their outer class. If that outer class is for example a Fragment or Activity, then this reference means that the long-running handler/loader/task will hold a reference to the activity which prevents it from getting garbage collected. Similarly, direct field references to activities and fragments from these longer running instances can cause leaks. ViewModel classes should never point to Views or non-application Contexts.