概述
Android的Theme个人理解其实就像是网页中的CSS,甚至连标签的名字都感觉是一样的,如style标签。
通常在APK开发的过程中,对UI/UE设计好的UI界面进行实现一定会用到styles, 看有的博客上写到style和theme,
其实无论是style还是theme都是对view控件的显示属性进行控制,区别在于影响范围的大小,Theme针对的是Application,
Activity等大的控件,影响的是整个APP,或者某个界面的整体风格;而普通命名的style针对类似Button, TextView等较小的控件。
也可以做如下理解:
- Theme是针对窗体级别的,改变窗体样式;通过android:theme应用于AndroidManifest中的Application或者Activity节点。
- Style是针对窗体元素级别的,改变指定控件或者Layout的样式;通过style或者@style/XX应用于指定控件。
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之前调用才会生效?
答案后续添加。。。。
最后
以上就是魁梧金毛为你收集整理的Android 自定义theme的全部内容,希望文章能够帮你解决Android 自定义theme所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复