我是靠谱客的博主 魁梧金毛,最近开发中收集的这篇文章主要介绍Android 自定义theme,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

答案后续添加。。。。

最后

以上就是魁梧金毛为你收集整理的Android 自定义theme的全部内容,希望文章能够帮你解决Android 自定义theme所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部