0

Я использовал метод для получения цветовых атрибутов из текущего Context:Получить Тему Attribute из приложений класса

public static int getColorAttribute(Context context, @AttrRes int attr) { 
    final TypedValue value = new TypedValue(); 
    context.getTheme().resolveAttribute(attr, value, true); 
    return value.data; 
} 

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

int colorAccent = Util.getColorAttribute(this, R.attr.colorAccent); 

Это вернет "colorAccent", что я поставил в themes.xml как мой AppTheme в моем манифесте. Но в классе Application мне пришлось позвонить getApplicationContext() вместо this. Поэтому я переключил один из моих других экземпляров метода в Activity на getApplicationContext(), и он вернул 0. Я также пробовал getApplication() и getBaseContext() с тем же результатом.

Мне было интересно, есть ли способ получить цвет от темы приложения в классе Application. Или, если нет, почему getApplicationContext().getTheme(), похоже, не возвращает тему приложения.

ответ

2

Вы пытаетесь сами установить тему?

getApplicationContext().getTheme().applyStyle(R.style.someTheme, true); 

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

+0

Это работает! Кроме того, технически я не использую его для задачи пользовательского интерфейса, я использую его для установки цвета значка уведомлений. Я мог бы использовать 'getColor()', но я хотел сохранить его относительно акцента цвета в случае его изменения. В любом случае, не следует ли делать это в классе 'Application'? Может быть, моя «MainActivity» или «PreferenceActivity» вместо этого? Я делаю это только в своем классе 'Application', потому что именно там я настраиваю остальные свойства уведомлений. – Bryan

+0

Кроме того, я не думал об этом раньше, но я мог бы использовать «ContextThemeWrapper». Я думаю, может быть, это лучше использовать в классе 'Application'? Таким образом, я не использую контекст приложения напрямую. – Bryan

+0

из моего понимания ContextthemeWrapper - это когда у вас уже есть контекст, но что добавить к нему несколько тем. Таким образом, вы можете использовать несколько элементов пользовательского интерфейса из разных тем. – j2emanue

Смежные вопросы