我意识到,对于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="..."
答案 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()
。