在应用开发中,用的最多的是style,引用style可以使布局变为统一的风格,但和Theme比起来,style是不是有点low呢,Theme能统一整个应用的风格,如:字体大小、字体颜色、背景颜色等。在统一风格上,Google官方提供了许多Theme,一种是API自带的Theme ;另一种是V7包里面提供的Theme,当然了我们也可以自己定义Theme
1.Theme中标签的初始化
在Theme中用的最多的是去掉标题,那我就以Theme是否去掉标题为例,来说下item的前世今生
1.1
当在Theme中加入去掉标题的item时,界面不会出现标题;
<item name="windowNoTitle">true</item>
当在Theme中去掉标题的item时,界面会出现标题。
有些同学就会好奇:为什么加入一个item为”windowNoTitle”的就可以去掉标题呢,好神奇的赶脚,那我随便写一个会出现什么样的效果呢。答案是随便写一个会报错,实践是检验真理的唯一标准,不信的同学可以在AS上试试。继续怀着好奇心:那么”windowNoTitle”是怎么初始化的呢,带着这些问题,我们来分析源码
源码分析:
在/frameworks\base\core\res/attrs文件下竟然找到了”windowNoTitle”,这个自定义的样式名字是”Window”,windowNoTitle是它的一个属性,原来这是一个自定义啊,这下好说了,我们再找它的初始化
在frameworks\base\core\java\android\view下的Window.java文件中,看看getWindowStyle()方法
public final TypedArray getWindowStyle() {
synchronized (this) {
if (mWindowStyle == null) {
mWindowStyle = mContext.obtainStyledAttributes(
com.android.internal.R.styleable.Window);
}
return mWindowStyle;
}
}
在该方法中,初始化了”Window”的样式,那是谁在调用它的呢
在frameworks\base\core\java\com\android\internal\policy\PhoneWindow.java的generateLayout(DecorView decor)中得到了这个样式,并进行了初始化
protected ViewGroup generateLayout(DecorView decor) {
// Apply data from current theme.
TypedArray a = getWindowStyle();
...
if (a.getBoolean(R.styleable.Window_windowNoTitle, false)) {
requestFeature(FEATURE_NO_TITLE);
} else if (a.getBoolean(R.styleable.Window_windowActionBar, false)) {
// Don't allow an action bar if there is no title.
requestFeature(FEATURE_ACTION_BAR);
}
看到没有!看到没有!见到了熟悉的”windowNoTitle”,那是谁调用了的呢,我们继续搜
public void setContentView(int layoutResID) {
// Note: FEATURE_CONTENT_TRANSITIONS may be set in the process of installing the window
// decor, when theme attributes and the like are crystalized. Do not check the feature
// before this happens.
if (mContentParent == null) {
installDecor();
}
...
看到没有!看到没有!看到没有!setContentView()这个方法熟悉吗?!
总结
Theme里面的item是在attrs下定义属性,在onCreate初始化时就把Theme加载进来了,写的不是很完善,后续还会更新的。这是我的第一篇博客