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

Ответить
Ferz
Сообщения: 2
Зарегистрирован: 24 фев 2014, 21:18

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

Сообщение Ferz » 24 фев 2014, 21:32

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

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

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 24 фев 2014, 22:23

Нужно передавать в эти классы контекст. Обычно он запрашивается прямо в конструкторае.
За этим контекстом ходить далеко не нужно, сама активити я является наследником класса Context.
Ресурсы из контекста получаются так: context.getResources().getString(R.string.some_string)
Это для строк, для других видов ресурсов полно других методов.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

samodelkin
Сообщения: 52
Зарегистрирован: 27 ноя 2013, 15:23

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

Сообщение samodelkin » 25 фев 2014, 06:25

Доступ к ресурсам можно получит из активности, чтобы получить возможность обращаться к активности из любого класса, проще всего в главной активности создать статичную ссылку таким образом:
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()...

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 25 фев 2014, 07:11

samodelkin, вы что, кто вас учил так делать?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 25 фев 2014, 09:00

Foenix писал(а):samodelkin, вы что, кто вас учил так делать?
:D , так все делают... ты что не знала?! :o
R.id.team
Политика на форуме запрещена

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 25 фев 2014, 09:04

с ума посходили..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 25 фев 2014, 09:10

Нужно передавать в эти классы контекст. Обычно он запрашивается прямо в конструкторае.
Ага, а потом получить 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, то можно погуглить. Он очень часто помогает во многих вещах.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 25 фев 2014, 10:58

m090050 писал(а):Самый, самый разумный тут способ, это сделать Singleton из класса, унаследованного от Application класса.
В итоге получаем жесткую зависимость нашего класса от класса аппликации. Для получения контекста аппликации можно воспользоваться getApplicationContext().
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 25 фев 2014, 11:14

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 и ипортировать можно.... :)
Изображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 25 фев 2014, 17:43

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

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

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

Ferz
Сообщения: 2
Зарегистрирован: 24 фев 2014, 21:18

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

Сообщение Ferz » 25 фев 2014, 19:13

Спасибо всем за ответы! ))) Буду разбираться и подбирать оптимальный вариант...

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 25 фев 2014, 20:45

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

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

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 25 фев 2014, 21:01

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

Sukaba
Сообщения: 2
Зарегистрирован: 18 янв 2018, 20:07

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

Сообщение Sukaba » 07 янв 2021, 15:30

Подскажите, если можно:
Вот сделал как рекомендует 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.

Ответить