Android中的属性,是怎么应用到控件上的(四)

来源:互联网 发布:300英雄皮肤cdk 淘宝 编辑:程序博客网 时间:2024/06/05 18:19

还有些问题 

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也可以,只是不方便吧。

阅读全文
0 0
原创粉丝点击