2017-02-01 2 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); 

... 내가 단지를 추출 할 필요를 단일 값, 나는 현재의 테마를 바꾸고 싶지 않습니다. 우리가 우리의 기본 Context 주위에 원하는 테마로 임시 ContextThemeWrapper를 작성하여이 작업을 수행 할 수 있습니다처럼 가능한 모든 Context 할 것으로 예상하지만 래퍼가 주어진 테마에 존재하는 모든 속성 값을 교체해야합니다으로

+1

어쩌면 같은'테마 darkTheme = 새로운 ContextThemeWrapper (getBaseContext(), R.style.AppTheme.Dark) .getTheme(); '. 그것은 다소 우회적 인 것처럼 보이지만,'Theme'을 직접 인스턴스화 할 방법이 있는지 확실하지 않습니다. 나는 파기를해야 할 것이다. –

+0

유망 해 보입니다. 지금 당장 시험해 보겠습니다. –

+0

는 제게는 충분합니다. 답을 쓰면 받아 들일 것입니다. –

답변

4

그것은, 보인다. 다음과 같이

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

또 다른 옵션이다. ThemeContext에 대한 참조를 보유하지 않는 것처럼 보이므로이 방법이 더 좋습니다.

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

내 경우에는 작동하지만 캐시 이미지를 만들려면 활동이 끝날 때 사용하고 있습니다. 나는 당신이 그것으로 작업을 계속한다면 그것이 활동에 부정적인 영향을 미치는지 모른다. –

+1

다른 방법으로 찾아 냈습니다. 우리가 정당한 이유없이 'Context'를 던지지 않고 있기 때문에이 것이 조금 더 좋을 것이라고 생각합니다. –

+1

멋지다, 두 번째 옵션도 잘 작동하며 예. 나도 더 좋아. –

관련 문제