肯定是布局文件里写了android:src="@drawable/default"
,从服务端获取数据后,手动调用了setImageDrawable(serverDrawable)
。解决办法是,去掉布局文件重的android:src="@drawable/default"
,直接在代码中设置默认图片setImageDrawable(getDrawable(R.drawable.default)
问题解析:
该框架是基于Resource Id来进行换肤的。控件初始化时,框架会解析布局文件中设置的资源(或者有业务代码直接设置setImageResource(R.drawable.default)
),例如本例中的R.drawable.default
,在切换皮肤时,根据资源名default,去查找需要换肤的资源。所以当获取到服务端数据后,更新了drawable,但是框架所知道的需要换肤的资源还是R.drawable.default
,在切换皮肤的时候,找不到对应的皮肤资源,就是用了默认的资源。
代码中使用new View()创建对象,框架无法知道该控件的存在。可以在代码中使用View.inflate()来实例化view对象。
问题解析:
该框架是基于LayoutInfalter在实例化View的时候,将View替换成自定义View的方式实现的,所以代码中创建的实例对象,框架无法感知。原本可以通过提供一个接口,让业务层代码在创建View的时候,主动通知框架,但是这样,在接入框架时会对业务代码有所侵入,所以没有采取该种方案。而是让业务代码统一使用View.inflate()的方式来实例化View对象。
可以通过查看更新日志,确定该控件的该属性,框架是否提供默认换肤支持。
问题解析:
该框架默认支持了一些常用的属性换肤。出于对换肤性能的考虑,不常用的属性,没有做默认支持,业务层可根据自己的需求,参考自定义View换肤来扩展。
可以通过动态设置textAppearance
来实现textColor
的换肤操作。mTextView.setTextAppearance(R.style.CustomTextAppearance);
问题解析:
该框架是基于Resource Id来进行换肤的。控件初始化时,框架会解析布局文件中设置的资源(或者有业务代码直接设置setTextAppearance(R.style.CustomTextAppearance)
,会从该style中解析出textColorResId)。
检查一下是否使用了appcompat-v7库里的主题,eg: <style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
问题解析:
该框架在运行时会替换所有需要换肤的组件 eg: TextView -> SkinCompatTextView,而SkinCompatTextView继承自appcompat-v7包里的AppCompatTextView。所以需要使用appcompat-v7包里的主题。
框架是支持的,需要把drawable下的xml文件也放到皮肤包里。
问题解析:
该框架在运行时会根据资源的resources entry name寻找皮肤包中的资源进行换肤,出于性能考虑,未对drawable/color目录下的xml文件进行解析,而是采用最简单的方法,将需要换肤的xml资源在皮肤包里放一份。