我需要从主题中提取默认值,但不是从当前主题中提取。
我知道我可以从当前主题中获取属性,如下所示:
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);
...
我只需要提取单个值,我不想更改当前主题。
似乎没有任何直接的方法来实例化或以其他方式创建Theme
资源中的对象,至少就我能找到的而言。
最初的建议是创建一个临时的ContextThemeWrapper
并得到Theme
对此表示反对。我们包装应用程序Context
,因为它不会(不应该)已经有一个主题:
Theme darkTheme = new ContextThemeWrapper(getApplicationContext(), R.style.AppTheme_Dark).getTheme();
然后我意识到我们可以做这样的事情:
Theme darkTheme = getResources().newTheme();
darkTheme.applyStyle(R.style.AppTheme_Dark, true);
事实证明,这正是ContextThemeWrapper
解决方案无论如何都是在内部进行的,所以这种方法显然是更好的,因为我们不会不必要地创建和丢弃ContextThemeWrapper
实例。
请注意,哪个并不重要Context
the getResources()
已拨打电话;最终newTheme()
只返回一个空值Theme
。此外,尽管有名称(以及样式和主题一般不可互换),Theme#applyStyle()
实际上确实需要一个主题资源 ID。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)