Android 自定义theme

Android的Theme类似于CSS,用于设置APP或界面整体风格,影响Application或Activity。Style则控制单个View或Layout的样式。Theme在AndroidManifest中静态应用,Style通过style/@style引用。自定义Theme包括在styles.xml定义样式,设置parent属性继承,然后在Manifest或代码中应用。动态设置Theme需在onCreate中调用setTheme,确保在setContentView之前。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android的Theme个人理解其实就像是网页中的CSS,甚至连标签的名字都感觉是一样的,如style标签。

通常在APK开发的过程中,对UI/UE设计好的UI界面进行实现一定会用到styles, 看有的博客上写到style和theme,

其实无论是style还是theme都是对view控件的显示属性进行控制,区别在于影响范围的大小,Theme针对的是Application,

Activity等大的控件,影响的是整个APP,或者某个界面的整体风格;而普通命名的style针对类似Button, TextView等较小的控件。

也可以做如下理解:

  1. Theme是针对窗体级别的,改变窗体样式;通过android:theme应用于AndroidManifest中的Application或者Activity节点。
  2. Style是针对窗体元素级别的,改变指定控件或者Layout的样式;通过style或者@style/XX应用于指定控件。
因此在定义theme和style的时候,可以使用的属性是不一样的,自定义的时候可以参考Android原生的theme和style,路径如下

Lollipop/frameworks/base/core/res/res/values/themes.xml

Lollipop/frameworks/base/core/res/res/values/styles.xml

同java中的继承一样,theme和style都有parent属性,可以通过继承来同样拥有其parent的属性设置,如果如果重新设置parent中已经

设置的属性则以重设置的为准,例如

<style name="Widget.ListView" parent="Widget.AbsListView"> 


自定义theme的基础步骤

1.在res/values目录下创建styles.xml。

   这个xml的名字不一定要叫做styles,你可以取任意的名字,重点是xml文件中的内容。个人理解values下的xml文件的

   名字只不过起到区分不同类型资源的作用,如String资源可以放在strings.xml里,style资源可以放在styles.xml里等。

2.styles.xml文件首行写上xml文档的声明,主要包括xml版本号和编码格式的声明,例如

 <?xml version="1.0" encoding="utf-8"?>

  这个声明不是必须的,但是如果要写就必须写在xml文件的首行, XML声明参考MSDN,在Andriod平台也验证过,

  XML声明并非必须。

3.在styles.xml中设计style标签中相关item的值,例如:

  Android4.4上的BrowserTheme的写法,这里没有将XML的声明贴出来。

16<resources>
17    <style name="BrowserTheme" parent="@android:Theme.Holo">
18        <item name="android:windowBackground">@color/white</item>
19        <item name="android:colorBackground">#FFFFFFFF</item>
20        <item name="android:windowActionBar">true</item>
21        <item name="android:windowNoTitle">false</item>
22        <item name="android:actionBarStyle">@style/ActionBarStyle</item>
23        <item name="android:actionBarSize">56dip</item>
24    </style>
25    <style name="Suggestions" parent="@android:style/Widget.Holo.AutoCompleteTextView">
26    </style>
27    <style name="ActionBarStyle" parent="@android:style/Widget.Holo.ActionBar">
28        <item name="android:background">@drawable/bg_browsertabs</item>
29        <item name="android:displayOptions"></item>
30    </style>
31</resources>
如上自定义BrowserTheme中设定了window的背景色,其parent为android:Theme.Holo,也就是说如果不进行修改,其默认为android4.4原生的

Theme.Holo风格。而style标签的下级标签item中的设定则是自定义的意义所在,其设定了Browser的界面是否有Tile和ActionBar,以及ActionBar的

风格。

另,Style资源定义的语法参考Android Developer官网

4.在styles.xml中将Theme相关的Item都已经设计完成之后就可以应用到Application,或者Activity等上了,应用Theme的方式主要有两种:

  1) 在AndroidManifest.xml中进行静态设定Theme,例如:

75        <activity android:name="BrowserActivity"
76                  android:label="@string/application_name"
77                  android:launchMode="singleTask"
78                  android:alwaysRetainTaskState="true"
79                  android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|mnc|mcc"
80                  android:theme="@style/BrowserTheme"
81                  android:windowSoftInputMode="adjustResize" >

  如上,给BrowserActivity设定了BrowserTheme,这样BrowserActivity的风格就是之前自定义的风格了。

  2)通过java代码进行Theme的设置,使用Context的setTheme这个接口来实现,用java代码来实现Theme的动态设定,在Activity的onCreate中进行调用,

必须在所有界面元素初始化之前进行调用,因此可以将setTheme放在setContentView之前进行调用,否则setTheme将不会生效,例如:

      setTheme((int)(this.getIntent().getExtras().getFloat("themeResId")));//这里我将intent中带过来的themeResId设置为当前Activity的theme,是为类保持两个Activity的风格一致。

      setContentView(R.layout.hello_world_plugin);


  binggo,自定义theme就完成啦,简单吧。

FAQ

1.style标签下的每一个item都用来定义view的某个显示属性的值,那么这些属性名都有哪些,怎么查找呢?

  首先确定该style是为哪个控件设计的,然后直接到Android Developer上查看该控件的XML Attributes,

  例如查看在设计TextView控件的显示效果时,可以查看该类的XML Attributes,其它控件类推。

  这里面Activity的比较特殊,可以到APIGuide->APP Manifest->Activity中查找

2.为什么setTheme一定要在setContentView之前调用才会生效?

答案后续添加。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值