burgessjp/ThemeSkinning

不知道我哪里操作不对,有些原生属性取不了

Opened this issue · 5 comments

自定义的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

<style name="SearchBusButton"> @color/order_bus_btn_text_color @drawable/rentange_round_red_selector match_parent @dimen/order_bus_btn_height @dimen/order_bus_btn_margin_left @dimen/order_bus_btn_margin_right @dimen/order_bus_btn_margin_top @dimen/order_bus_btn_margin_bottom center @dimen/order_bus_btn_text_size </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获取不到,真是奇了怪了,你们找到原因了吗