2013-04-04 40 views
5

好工作,我意識到,對於Context.getTheme(),它通常並不好,如果我們使用Application作爲Context爲什麼getTheme不會對應用

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="..." 

回答

3

它不工作,因爲顯然是getApplicationContext()返回的對象不是一個完整的Context對象,如上所述in this answer by CommonsWare

這不是一個完整的Context,支持一切Activity一樣。你會嘗試用這個Context做的各種事情都會失敗,主要與GUI有關。

一個潛在的解決方案是手動設置主題上Context,像這樣:

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

但是這種方法不是由Android開發團隊的認可;正確的解決方案是將Activity用於與UI相關的事物,如getTheme()

相關問題