上一篇幅Android Styles & Themes(一)——Style介紹了Style神奇的魅力,下面繼續(xù)體驗Theme的效果。就像Style一樣,Theme依然在<style>元素里邊申明,也是以同樣的方式引用。不同的是通過在Android Manifest中定義的<application>和<activity>元素將主題添加到整個程序或者某個 Activity,但是主題是不能應用在某一個單獨的View里。
<?xml version=”1.0″ encoding=”UTF-8″?>
<resources>
<style name=”NewTheme” parent=”android:Theme.Black”>
<item name=”android:windowNoTitle”>true</item>
<item name=”android:textSize”>14sp</item>
<item name=”android:textColor”>#FFFF0000</item>
</style>
</resources>
以上資源的定義,相信大家一看就明白,在這里需要強調(diào)的是:有些資源定義中使用了@符號和?符號來引用資源。,對這2個符號的作用解釋如下:
這些技巧只能用在XML資源當中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.NewTheme);
setContentView(R.layout.main);
}
這里需要注意的是,對于theme資源的引用,資源ID不是文件名(theme.xml),而是資源名(NewTheme)。運行后的界面顯示如下:
比如:我們修改Theme.Dialog Theme,繼承Theme.Dialog來生成一個新的Theme。<style parent=”@android:style/Theme.Dialog”>
繼承了Theme.Dialog后,我們可以按照我們的要求來調(diào)整Theme。我們可以修改在Theme.Dialog中定義的每個item元素的值,然后我們 在Android Manifest 文件中使用NewDialogTheme而不是 Theme.Dialog。
以上的例子比較簡單,在使用中也發(fā)現(xiàn)不少問題,例如Android SDK中定義的一個theme.xml如下:
<?xml version=”1.0″ encoding=”utf-8″?>
<resources>
<style name=”CustomTheme”>
<item name=”android:windowNoTitle”>true</item>
<item name=”windowFrame”>@drawable/screen_frame</item>
<item name=”windowBackground”>@drawable/screen_background_white</item>
<item name=”panelForegroundColor”>#FF000000</item>
<item name=”panelBackgroundColor”>#FFFFFFFF</item>
<item name=”panelTextColor”>?panelForegroundColor</item>
<item name=”panelTextSize”>14</item>
<item name=”menuItemTextColor”>?panelTextColor</item>
<item name=”menuItemTextSize”>?panelTextSize</item>
</style>
</resources>
這個例子看上去,就發(fā)現(xiàn)幾個不太符合規(guī)范的地方:
將這個theme引用到程序中,發(fā)現(xiàn)如下錯誤:Error:no resource found that matches the given name: panelForegroundColor,這個錯誤讓人莫名其妙。Android SDK中提供的例子程序,以前也發(fā)現(xiàn)了一些小問題,比如說:XML文件中少了符號“。由于對Theme文檔的定義、到底有哪些屬性,Google沒有提供文檔說明,這個錯誤不知道如何修改。在網(wǎng)上google了下,很多人都發(fā)現(xiàn)了這個問題,目前還沒有人給出具體的解決辦法,我們會繼續(xù)深入的研究Theme,有同樣問題的可以在后續(xù)篇幅中關注這個問題的解決方法。