Android 自定义theme

来源:互联网 发布:win7卸载软件出错 编辑:程序博客网 时间:2024/05/18 21:49

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之前调用才会生效?

答案后续添加。。。。

0 0
原创粉丝点击