ThemeSkinning
ThemeSkinning copied to clipboard
不知道我哪里操作不对,有些原生属性取不了
自定义的SkinAttr public class TextStyleAttr extends SkinAttr { @Override protected void applySkin(View view) { if (view instanceof TextView) { TextView tv = (TextView) view; Context context = view.getContext(); int styleID = context.getResources().getIdentifier(attrValueRefName, "style", context.getPackageName()); int[] skinAttrs = {textColor, background, layout_width, layout_height, layout_marginLeft, layout_marginRight, layout_marginTop, layout_marginBottom, gravity, textSize}; TypedArray a = context.obtainStyledAttributes(styleID, skinAttrs); int textColorId = a.getResourceId(0, -1); int backgroundId = a.getResourceId(1, -1); int layout_width = a.getResourceId(2, 0); int layout_height = a.getResourceId(3, 0); int layout_marginLeft = a.getResourceId(4, -1); int layout_marginRight = a.getResourceId(5, -1); int layout_marginTop = a.getResourceId(6, -1); int layout_marginBottom = a.getResourceId(7, -1); int gravity = a.getResourceId(8, -1); int texSize = a.getResourceId(9, -1);
if (gravity != -1) {
tv.setGravity(SkinResourcesUtils.getGravity(gravity));
}
if (textColorId != -1) {
tv.setTextColor(SkinResourcesUtils.getColorStateList(textColorId));
}
if (texSize != -1) {
tv.setTextSize(SkinResourcesUtils.getDimen(texSize));
}
if (backgroundId != -1) {
tv.setBackgroundDrawable(SkinResourcesUtils.getDrawable(backgroundId));
}
}
} 自定义的style
看清楚哈 有android:layout_marginTop属性,但是在自定义的SkinAttr里 int layout_marginTop = a.getResourceId(6, -1);总是等于-1.
<style name="SearchBusButton"> <item name="android:textColor">@color/order_bus_btn_text_color</item> <item name="android:background">@drawable/rentange_round_red_selector</item> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">@dimen/order_bus_btn_height</item> <item name="android:layout_marginLeft">@dimen/order_bus_btn_margin_left</item> <item name="android:layout_marginRight">@dimen/order_bus_btn_margin_right</item> <item name="android:layout_marginTop">@dimen/order_bus_btn_margin_top</item> <item name="android:layout_marginBottom">@dimen/order_bus_btn_margin_bottom</item> <item name="android:gravity">center</item> <item name="android:textSize">@dimen/order_bus_btn_text_size</item> </style>
不是太清楚这里你这样做的用意是什么。大概看了下,不太清楚原因,但是强烈不建议你在这里这样去处理。
@burgessjp 这样做是为了读取style文件里的属性啊,然后把这些属性读取出来一一设置给要换肤的视图。 因为你默认只支持style文件里的textColor和background,本来想在源码上改,但是阔爱占星不好,所以就继承了skinattr,自己来专门读取style文件的属性。你直接读取background也好,读取src也好,和我读取style是一样的嘛,只是我这样写之后,唯独int layout_marginTop = a.getResourceId(6, -1)这个返回-1,但其实我源style文件和皮肤style文件里都定义了这个属性的。
或者说,如果要用style来换肤,我应怎么写呢?
就你的代码来说是没问题的,我支持style换肤原理也是这样去做的。具体原因你可以自己去建一个获取属性值的demo试试,我这也看不出问题。
@ykbjson @burgessjp 我也跟你一样去获取style属性,但我的layout_margin_top没问题,而是textSize和textColor两个同时出现的话后面出现的那个typearray获取不到,真是奇了怪了,你们找到原因了吗