【问题标题】:Get Theme Attribute from Application Class从应用程序类获取主题属性
【发布时间】:2016-03-07 06:55:39
【问题描述】:

我一直在用一种方法从当前Context获取颜色属性:

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);

这将返回我在 themes.xml 中设置的 "colorAccent" 作为我在 Manifest 中的 AppTheme。但是在Application 类中,我不得不调用getApplicationContext() 而不是this。因此,我也将Activity 中该方法的其他实例之一切换为getApplicationContext(),并返回0。我还尝试了getApplication() 和getBaseContext(),结果相同。

我想知道是否有办法从 Application 类中的应用程序主题中获取颜色。或者如果不是,为什么getApplicationContext().getTheme() 似乎没有返回应用程序主题。

【问题讨论】:

    标签: java android android-theme android-styles android-attributes


    【解决方案1】:

    您可以尝试自己设置主题吗?

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

    然后在样式中有你的主题是你想要在 android 中的某个主题的子主题。此外,应该不赞成这种方法,因为主题是要从活动上下文中访问的。 UI 任务的应用程序上下文不完整。

    【讨论】:

    • 行得通!另外,从技术上讲,我不是将它用于 UI 任务,而是使用它来设置通知图标的颜色。我可以使用getColor(),但我想保持它与颜色重音相关,以防它发生变化。无论如何,我不应该在我的Application 课堂上这样做吗?也许是我的MainActivity 或PreferenceActivity?我只在我的 Application 类中这样做,因为我正在设置我的其余通知属性。
    • 另外,我之前没有想到,但我也可以使用ContextThemeWrapper。我认为在Application 类中使用可能会更好?这样我就不会直接使用应用程序上下文。
    • 据我了解,ContextthemeWrapper 是指您已经有了一个上下文,但是要向其中添加多个主题。因此,您可以使用来自不同主题的多个 UI 元素。
    • 嗯,我以为ContextThemeWrapper 给了你一个新的Context,它的作用类似于给定的Context,这样你就可以设置一个主题而不实际改变原来的Context。至少这是我从ContextWrapper 描述中得到的:“代理实现的 Context 只是将其所有调用委托给另一个 Context。可以子类化以修改行为而无需更改原始 Context。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多