(转)Android Styles & Themes(下)——Theme

Android Styles & Themes(下)——Theme

By: 海市蜃楼 | In: Android开发


上一篇幅Android Styles & Themes(一)——Style介绍了Style神奇的魅力,下面继续体验Theme的效果。就像Style一样,Theme依然在<style>元素里边申明,也是以同样的方式引用。不同的是通过在Android Manifest中定义的<application>和<activity>元素将主题添加到整个程序或者某个 Activity,但是主题是不能应用在某一个单独的View里。

定义Theme的一个例子

<?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>

以上资源的定义,相信大家一看就明白,在这里需要强调的是:有些资源定义中使用了@符号和?符号来引用资源。,对这2个符号的作用解释如下:

  • @ 表明我们应用的资源是前边定义过的(或者在前一个项目中或者在Android 框架中)。
  • ?表明我们引用的资源的值在当前的主题当中定义过。

这些技巧只能用在XML资源当中

在程序中使用Theme的方法

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.NewTheme);
setContentView(R.layout.main);
}
这里需要注意的是,对于theme资源的引用,资源ID不是文件名(theme.xml),而是资源名(NewTheme)。运行后的界面显示如下:

在AndroidManifest.xml中应用Theme

  • 为了在当前所有的Activity当中使用Theme,可以打开AndroidManifest.xml 文件,编辑<application>标签,让其包含android:theme属性,值是一个主题的名字,例如:<application android:theme=”@style/NewTheme”>。
  • 如果只是想让程序当中的某个Activity拥有这个Theme,那么可以修改<activity>标签。Android中提供了几种内置的资源,有好几种Theme你可以切换而不用自己写。比如可以用对话框Theme来让你的Activity看起来像一个对话框。在manifest中定义,例如:<activity android:theme=”@android:style/Theme.Dialog”>
  • 如果喜欢一个Theme,但是想做一些轻微的改变,只需要将这个Theme添加为parent。Android SDK为我们提供了很多现成的Theme,部分列举如下:

    比如:我们修改Theme.Dialog Theme,继承Theme.Dialog来生成一个新的Theme。<style parent=”@android:style/Theme.Dialog”>
    继承了Theme.Dialog后,我们可以按照我们的要求来调整Theme。我们可以修改在Theme.Dialog中定义的每个item元素的值,然后我们 在Android Manifest 文件中使用NewDialogTheme而不是 Theme.Dialog。

总结说明

以上的例子比较简单,在使用中也发现不少问题,例如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>

这个例子看上去,就发现几个不太符合规范的地方:

  1. item name属性有些没有前缀Android,这似乎不符合Android SDK中定义的规范,规范详解请阅读 AndroidManifest.xml文件结构说明
  2. <item name=”panelTextSize”>14</item>,值缺少单位,应该是14sp;

将这个theme引用到程序中,发现如下错误:Error:no resource found that matches the given name: panelForegroundColor,这个错误让人莫名其妙。Android SDK中提供的例子程序,以前也发现了一些小问题,比如说:XML文件中少了符号“。由于对Theme文档的定义、到底有哪些属性,Google没有提供文档说明,这个错误不知道如何修改。在网上google了下,很多人都发现了这个问题,目前还没有人给出具体的解决办法,我们会继续深入的研究Theme,有同样问题的可以在后续篇幅中关注这个问题的解决方法。

相关文章


//问答:

qingyun

十一月 6th, 2009 at 9:54 上午

我也发现一个问题
当应用Theme的时候,使用setTheme()函数加载自定义theme好像不起作用
只有当在AndroidManifest.xml的application或者Activity中定义android:theme=”@style/newTheme”时才起作用,

还有,对于android包下的R.Style中定义的一些Theme,好像都不能用
想在我就知道可以使用的已定义Theme有Theme.Black,Theme.Light,Theme.Dialog,Theme.Panel和Theme.Translucent,
对于那些复合的单词如Theme_Light_NoTitleBar就不能像这样使用 parent=”Theme.Light_NoTitleBar,会报错

对以上问题,如果方便的话,还请指点迷津


Johnny Kwok

十一月 27th, 2009 at 3:47 下午

@qingyun
复合的单词中间的_用.代替即可;Theme.Light_NoTitleBar应该写成Theme.Light.NoTitleBar


pjq

十二月 31st, 2010 at 10:07 上午

发现这是一个Android的Bug,,setTheme必须要放在super.onCreate(savedInstanceState);之前调用才有效,,http://nullcc.blogbus.com/logs/90152888.html




转自:http://www.moandroid.com/?p=918

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值