为什么getTheme在应用程序上不能很好地工作

时间:2013-04-04 07:18:15

标签: android

我意识到,对于Context.getTheme(),如果我们使用Application作为Context

,通常效果不佳
MyApplication.singletonInstance().getTheme().resolveAttribute(R.attr.actionBarDeleteIcon, typedValue, true);
// typedValue.resourceId will be 0x0, which is invalid

但是,如果我使用Activity作为上下文,则效果很好

MyFragment.this.getActivity().getTheme().resolveAttribute(R.attr.actionBarDeleteIcon, typedValue, true);
// typedValue.resourceId is valid

我想知道为什么我们无法通过Application解析属性?

在清单中,我们在Application级别找到了特定的主题信息。所以,我认为从Application对象获取主题确实有意义。

<application
    android:theme="..."

1 个答案:

答案 0 :(得分:3)

它不起作用,因为显然getApplicationContext()返回的对象不是完整的Context对象,如上所述in this answer by CommonsWare

  

这不是一个完整的Context,支持Activity所做的一切。您将尝试使用此Context进行的各种操作将失败,主要与GUI有关。

一个可能的解决方案是在Context上手动设置主题,如下所示:

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

但这种方法并未得到Android开发团队的认可;正确的解决方案是使用Activity来处理与UI相关的内容,例如getTheme()