还有些问题
1、如果不在Application里设置Theme也会有风格出现为什么?
2、Theme和Style有什么区别。
会到这个函数
final TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.Spinner, defStyleAttr, defStyleRes);
属性应用的最关键还是这个函数
/**
* Retrieve styled attribute information in this Context's theme. See
* {@link android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)}
* for more information.
*
* @see android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)
*/
public final TypedArray obtainStyledAttributes(
AttributeSet set, @StyleableRes int[] attrs, @AttrRes int defStyleAttr,
@StyleRes int defStyleRes) {
return getTheme().obtainStyledAttributes(
set, attrs, defStyleAttr, defStyleRes);
}
可以看到是先getTheme(),应该就是获取them的方法了,点击去,
/**
* Return the Theme object associated with this Context.
*/
@ViewDebug.ExportedProperty(deepExport = true)
public abstract Resources.Theme getTheme();
是一个Context的抽象方法,去看具体实现类就Activity把。
Activity extends ContextThemeWrapper
再去看ContextThemeWrapper
@Override
public Resources.Theme getTheme() {
if (mTheme != null) {
return mTheme;
}
mThemeResource = Resources.selectDefaultTheme(mThemeResource,
getApplicationInfo().targetSdkVersion);
initializeTheme();
return mTheme;
}
找到这个函数,如果我不设置风格的话 就会selectDefaultTheme(),在Resources中找到
public static int selectDefaultTheme(int curTheme, int targetSdkVersion) {
return selectSystemTheme(curTheme, targetSdkVersion,
com.android.internal.R.style.Theme,
com.android.internal.R.style.Theme_Holo,
com.android.internal.R.style.Theme_DeviceDefault,
com.android.internal.R.style.Theme_DeviceDefault_Light_DarkActionBar);
}
继续
/** @hide */
public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo,
int dark, int deviceDefault) {
if (curTheme != 0) {
return curTheme;
}
if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) {
return orig;
}
if (targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return holo;
}
if (targetSdkVersion < Build.VERSION_CODES.N) {
return dark;
}
return deviceDefault;
}
结果就是,会根据SDK的版本来给选择一个风格加上,不会存在没有风格的现象出现。
在源码的Values文件夹下
问题得到解决
1、不设置Theme,会根据使用SDK的版本来设置Theme
2、Theme和XXXStyle没有区别,都是属性的集合。
(XML 使用原理 Thinking in java 第4版 586页,书中使用XOM类库解析,大概就是像遍历树一样,从上到下分级解析)
总之:我认为android的XML只是android便于管理资源文件的一个工具,归根结底还是在java中把这些XML解析出来使用,不用XML也可以,只是不方便吧。