2017-02-01 4 views
2

Мне нужно извлечь значение по умолчанию из темы, НО НЕ из текущей темы.Как получить тему по ее ссылке id

Я знаю, что я могу получить получить атрибуты из текущей темы, как это:

TypedValue typedValue = new TypedValue(); 
Theme currentTheme = context.getTheme(); 
currentTheme.resolveAttribute(android.R.attr.windowBackground, typedValue, true); 
// result is in: typedValue.data 

, но мне нужно что-то вроде:

Theme darkTheme = getTheme(R.style.AppTheme.Dark); 

... нужно только извлечь Единственное значение, я не хочу менять текущую тему.

+1

Может быть что-то вроде 'Тема darkTheme = новый ContextThemeWrapper (getBaseContext(), R.style.AppTheme.Dark) .getTheme();'. Это похоже на круговое движение, но я не уверен, есть ли способ создать экземпляр 'Theme' напрямую. Мне нужно сделать рытье. –

+0

выглядит многообещающе, попробовав прямо сейчас –

+0

работает достаточно хорошо для меня, если вы положите его в ответ, я приму его –

ответ

4

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

Theme darkTheme = new ContextThemeWrapper(getBaseContext(), R.style.AppTheme_Dark).getTheme(); 

Другой вариант заключается в следующем. Это может быть предпочтительным, так как выглядит так, как будто Theme не содержит ссылки на любые Context.

Theme darkTheme = getResources().newTheme(); 
darkTheme.applyStyle(R.style.AppTheme_Dark, true); 
+0

Он работает для моего случая, я использую его в конце действия для создания образа кеша. Я не знаю, оказывает ли это негативное влияние на Activity, если вы продолжаете работать с ним. –

+1

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

+1

Прохладный, второй вариант работает, и да, мне также нравится это лучше. –

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