Может ли контекст Android внутри действия быть статичным? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть статическая функция, в которой мне нужно получить доступ к своим ресурсам цвета.Для доступа к цветовым ресурсам мне нужна переменная контекста, которая является статической.Я запутался, если смогу сделать контекст статичным.Есть ли какие-либо побочные эффекты?или, есть ли другой способ получить доступ к своим ресурсам без использования контекста

Вот функция

 private static SpannableStringBuilder setTextColor(
      SpannableStringBuilder Text, int spanLength, boolean isSuggestion) {
    addressText.setSpan(
        new ForegroundColorSpan(
            context
                .getResources()
                .getColor(
                    isSuggestion ? R.color.blur: R.color.red)),
        addressText.length() - 1 - spanLength,
        addressText.length(),
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return Text;
  } 

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

В Kotlin этого можно добиться, создав класс, расширяющий Application, и сохранив контекст приложения в объекте-компаньоне.

Обычно это будет выглядеть примерно так:

class App : Application() {

    override fun onCreate() {
        super.onCreate()
        instance = this
    }

    companion object {
        private var instance: App? = null
        val context: Context?
            get() = instance?.applicationContext
    }
}

И вы можете получить доступ к контексту в любом месте через App.context

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

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

0 голосов
/ 05 марта 2019

Я запутался, если смогу сделать контекст статичным.Есть ли какие-либо побочные эффекты?

Вы можете объявить контекст как статический, но это не рекомендуется в Android, поскольку это может привести к утечке памяти в вашем приложении.

есть ли другой способ получить доступ к своим ресурсам без использования контекста?

Нет, вам нужен экземпляр контекста для доступа к ресурсам в вашем приложении.

Вернемся к вашему случаю. Самый простой способ - передать контекст в качестве параметра метода.

private static SpannableStringBuilder setTextColor(Context context, SpannableStringBuilder Text, int spanLength, boolean isSuggestion) {
    int color = context.getResources().getColor(isSuggestion ? R.color.blur : R.color.red);

    addressText.setSpan(new ForegroundColorSpan(color),
            addressText.length() - 1 - spanLength,
            addressText.length(),
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    return Text;
}

Внутри своей деятельности передайте this в качестве контекста, например, при вызове setTextColor.

setTextColor(this, new SpannableStringBuilder(), 0, false); 
0 голосов
/ 05 марта 2019

1) Создайте свой класс App, который расширяет Application

private static Context context;

@Override
public void onCreate() {
    super.onCreate();
    context = getApplicationContext();

2) Создайте метод getApplicationContext (), который возвращает контекст

public static Context getApplicationContext() {
  return context;
}

3) Теперь вы можете получить контекст в любом месте вашегокласс как

Context context = App.getContext().getApplicationContext();
...