动态改变View的Color等值
SkinWizard
这个换肤库是在研究了android-skin-loader之后,作为学习笔记做出来的一个换肤库
1、主要思路
通过配置不同的“皮肤”(style)文件,通过加载不同的style文件,为每个需要设置颜色(皮肤)的View设置不同的颜色资源。
2、 style配置
<!-- skin -->
<style name="Default">
<item name="android:textColor">#0000FF</item>
<item name="android:background">@color/colorAccent</item>
</style>
<style name="BlackNight">
<item name="android:textColor">#0FF0F0</item>
<item name="android:background">#f7f700</item>
</style>
如下,这样的资源文件可以通过
TypedArray typedArray = context.obtainStyledAttributes(styleResId, skinAttrs);
来获取。
3、使用LayoutInflater
获取需要配置颜色的View
public class SkinInflateFactory implements LayoutInflater.Factory {
private ArrayList<SkinItem> mSkinItems = new ArrayList<>();
private Context mContext;
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
mContext = context;
// 解析出需要换肤的控件
boolean skinChangeEnable = attrs.getAttributeBooleanValue(SkinConfig.SKIN_CHANGE_NAMESPACE, SkinConfig.SKIN_ATTRIBUTE_NAME, false);
if (skinChangeEnable) {
View view = createView(context, name, attrs);
parseSkinAttrs(view, attrs);
return view;
}
return null;
}
在onCreate
中如果返回null
则默认使用android自己的Inflate View的方法。
这里,通过获取需要换肤的View,缓存起来,然后现在需要换肤的时候动态读取配置就行了。
4、缺点
- 不能配置一些自定义的属性;
- 无法对不同的View的相同的颜色属性(譬如:TextView)配置出不用的颜色值。
网友评论