【问题标题】:How to obtain a theme by its reference id如何通过引用 id 获取主题
【发布时间】:2021-05-12 13:34:14
【问题描述】:

我需要从主题中提取默认值,但不是从当前主题中提取。

我知道我可以像这样从当前主题中获取属性:

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 darkTheme = new ContextThemeWrapper(getBaseContext(), R.style.AppTheme.Dark).getTheme();。这似乎有点迂回,但我不确定是否有任何方法可以直接实例化Theme。我得去挖掘一下。
  • 看起来很有希望,现在就试试吧
  • 对我来说效果很好,如果你把它放在答案中,我会接受它
  • 我要多花点时间。如果我发现任何更“正确”的内容,我会告诉你的。

标签: android android-resources


【解决方案1】:

似乎没有任何直接的方法可以从资源中实例化或以其他方式创建 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 上调用getResources() 并不重要;最终newTheme() 只返回一个空的Theme。此外,尽管名称(以及样式和主题的一般不可互换性),Theme#applyStyle() 实际上确实采用了主题资源 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2021-03-25
    相关资源
    最近更新 更多