activity调用setTheme(resid);
ColorUiUtil.changeTheme(rootView, getTheme());
获取属性信息
public MySolid(Context context, AttributeSet attrs) {
super(context, attrs);
Log.e("", "attrs"+attrs.getAttributeCount());
for(int i=0;i<attrs.getAttributeCount();i++){
Log.e("", "getAttributeName "+attrs.getAttributeName(i));
Log.e("", "getAttributeNameResource "+attrs.getAttributeNameResource(i));
Log.e("", "getAttributeValue "+attrs.getAttributeValue(i));
}
控件属性
<com.example.solid.MySolid
android:id="@+id/solid"
android:layout_width="400dp"
android:layout_height="300dp"
android:background="?image" >
</com.example.solid.MySolid>
android:background="?attr/image" 和?一样 引用自定义属性(会去style下找) ?android:attr/* 引用系统属性
attrs
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="image" format="color|reference" />
</resources>
style
<style name="AppTheme" parent="AppBaseTheme">
<item name="image">@drawable/ic_10</item>
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>
工具类:
public class ViewAttributeUtil {
public static int getAttributeValue(AttributeSet attr, int paramInt) {
int value = -1;
int count = attr.getAttributeCount();
for (int i = 0; i < count; i++) {
if (attr.getAttributeNameResource(i) == paramInt) {
String str = attr.getAttributeValue(i);
if (null != str && str.startsWith("?")) {
value = Integer.valueOf(str.substring(1, str.length())).intValue();
return value;
}
}
}
return value;
}
public static int getBackgroundAttibute(AttributeSet attr) {
return getAttributeValue(attr, android.R.attr.background);
}
public static int getCheckMarkAttribute(AttributeSet attr) {
return getAttributeValue(attr, android.R.attr.checkMark);
}
public static int getSrcAttribute(AttributeSet attr) {
return getAttributeValue(attr, android.R.attr.src);
}
public static int getTextApperanceAttribute(AttributeSet attr) {
return getAttributeValue(attr, android.R.attr.textAppearance);
}
public static int getDividerAttribute(AttributeSet attr) {
return getAttributeValue(attr, android.R.attr.divider);
}
public static int getTextColorAttribute(AttributeSet attr) {
return getAttributeValue(attr, android.R.attr.textColor);
}
public static int getTextLinkColorAttribute(AttributeSet attr) {
return getAttributeValue(attr, android.R.attr.textColorLink);
}
public static void applyBackgroundDrawable(ColorUiInterface ci, Resources.Theme theme, int paramInt) {
TypedArray ta = theme.obtainStyledAttributes(new int[]{paramInt});
Drawable drawable = ta.getDrawable(0);
if (null != ci) {
(ci.getView()).setBackgroundDrawable(drawable);
}
ta.recycle();
}
public static void applyImageDrawable(ColorUiInterface ci, Resources.Theme theme, int paramInt) {
TypedArray ta = theme.obtainStyledAttributes(new int[]{paramInt});
Drawable drawable = ta.getDrawable(0);
if (null != ci && ci instanceof ImageView) {
((ImageView) ci.getView()).setImageDrawable(drawable);
}
ta.recycle();
}
public static void applyTextAppearance(ColorUiInterface ci, Resources.Theme theme, int paramInt) {
TypedArray ta = theme.obtainStyledAttributes(new int[]{paramInt});
int resourceId = ta.getResourceId(0, 0);
if (null != ci && ci instanceof TextView) {
((TextView) ci.getView()).setTextAppearance(ci.getView().getContext(), resourceId);
}
ta.recycle();
}
public static void applyTextColor(ColorUiInterface ci, Resources.Theme theme, int paramInt) {
TypedArray ta = theme.obtainStyledAttributes(new int[]{paramInt});
int resourceId = ta.getColor(0, 0);
if (null != ci && ci instanceof TextView) {
((TextView) ci.getView()).setTextColor(resourceId);
}
ta.recycle();
}
public static void applyTextLinkColor(ColorUiInterface ci, Resources.Theme theme, int paramInt) {
TypedArray ta = theme.obtainStyledAttributes(new int[]{paramInt});
int resourceId = ta.getColor(0, 0);
if (null != ci && ci instanceof TextView) {
((TextView) ci.getView()).setLinkTextColor(resourceId);
}
ta.recycle();
}
}
换肤接口
public interface ColorUiInterface {
View getView();
void setTheme(Resources.Theme themeId);
}
重写需要换肤的控件 例如
public class ColorTextView extends TextView implements ColorUiInterface {
private int attr_drawable = -1;
private int attr_textAppearance = -1;
private int attr_textColor = -1;
private int attr_textLinkColor = -1;
public ColorTextView(Context context) {
super(context);
}
public ColorTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// this.attr_textAppearance = ViewAttributeUtil.getTextApperanceAttribute(attrs);
this.attr_drawable = ViewAttributeUtil.getBackgroundAttibute(attrs);
this.attr_textColor = ViewAttributeUtil.getTextColorAttribute(attrs);
this.attr_textLinkColor = ViewAttributeUtil.getTextLinkColorAttribute(attrs);
}
public ColorTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// this.attr_textAppearance = ViewAttributeUtil.getTextApperanceAttribute(attrs);
this.attr_drawable = ViewAttributeUtil.getBackgroundAttibute(attrs);
this.attr_textColor = ViewAttributeUtil.getTextColorAttribute(attrs);
this.attr_textLinkColor = ViewAttributeUtil.getTextLinkColorAttribute(attrs);
}
@Override
public View getView() {
return this;
}
@Override
public void setTheme(Resources.Theme themeId) {
Log.d("COLOR", "id = " + getId());
if (attr_drawable != -1) {
ViewAttributeUtil.applyBackgroundDrawable(this, themeId, attr_drawable);
}
// if(attr_textAppearance != -1) {
// ViewAttributeUtil.applyTextAppearance(this, themeId, attr_textAppearance);
// }
if (attr_textColor != -1) {
ViewAttributeUtil.applyTextColor(this, themeId, attr_textColor);
}
if (attr_textLinkColor != -1) {
ViewAttributeUtil.applyTextLinkColor(this, themeId, attr_textLinkColor);
}
}
}
public class ColorUiUtil {
/**
* 切换应用主题
*
* @param rootView
*/
public static void changeTheme(View rootView, Resources.Theme theme) {
if (rootView instanceof ColorUiInterface) {
((ColorUiInterface) rootView).setTheme(theme);
if (rootView instanceof ViewGroup) {
int count = ((ViewGroup) rootView).getChildCount();
for (int i = 0; i < count; i++) {
changeTheme(((ViewGroup) rootView).getChildAt(i), theme);
}
}
if (rootView instanceof AbsListView) {
try {
Field localField = AbsListView.class.getDeclaredField("mRecycler");
localField.setAccessible(true);
Method localMethod = Class.forName("android.widget.AbsListView$RecycleBin").getDeclaredMethod("clear");
localMethod.setAccessible(true);
localMethod.invoke(localField.get(rootView));
} catch (NoSuchFieldException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e2) {
e2.printStackTrace();
} catch (NoSuchMethodException e3) {
e3.printStackTrace();
} catch (IllegalAccessException e4) {
e4.printStackTrace();
} catch (InvocationTargetException e5) {
e5.printStackTrace();
}
}
} else {
if (rootView instanceof ViewGroup) {
int count = ((ViewGroup) rootView).getChildCount();
for (int i = 0; i < count; i++) {
changeTheme(((ViewGroup) rootView).getChildAt(i), theme);
}
}
if (rootView instanceof AbsListView) {
try {
Field localField = AbsListView.class.getDeclaredField("mRecycler");
localField.setAccessible(true);
Method localMethod = Class.forName("android.widget.AbsListView$RecycleBin").getDeclaredMethod("clear");
localMethod.setAccessible(true);
localMethod.invoke(localField.get(rootView));
} catch (NoSuchFieldException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e2) {
e2.printStackTrace();
} catch (NoSuchMethodException e3) {
e3.printStackTrace();
} catch (IllegalAccessException e4) {
e4.printStackTrace();
} catch (InvocationTargetException e5) {
e5.printStackTrace();
}
}
}
}
}