一个通过动态加载本地皮肤包进行换肤的皮肤框架

[复制链接]
来自: MrlLee 分类: Android精品源码 上传时间: 2016-7-7 11:41:11
Tag:项目 Android Failed commit latest

项目介绍:

游客,如果您要查看本帖隐藏内容请回复

一个通过动态加载本地皮肤包进行换肤的皮肤框架




更新日志




  • 导入到Android Studio,使用gradle构建皮肤包(见
    [Java] 查看源文件 复制代码
    7. 皮肤包是什么?如何生成?
    )(2015-12-02)

  • 解决Fragment换肤在某些版本的support-v4包下失效的问题(感谢@javake同学)(2015-12-02)

  • [Java] 查看源文件 复制代码
    textColor
    加入selector类型的资源的换肤支持(感谢@pinotao同学) (2015-09-26)

  • 添加在代码中创建的View的换肤支持 (2015-09-24)



工程目录介绍



[Java] 查看源文件 复制代码
Android-Skin-Loader
├── android-skin-loader-lib      // 皮肤加载库
├── android-skin-loader-sample   // 皮肤库应用实例
├── android-skin-loader-skin     // 皮肤包生成demo
└── skin-package                 // 皮肤包输出目录


演示



1. 下载demo, 将
[Java] 查看源文件 复制代码
BlackFantacy.skin
放在SD卡根目录


效果图

  • 换肤前 sample

  • 换肤后 sample

用法



1. 在
[Java] 查看源文件 复制代码
Application
中进行初始化



public class SkinApplication extends Application {
public void onCreate() {
super.onCreate();
// Must call init first
SkinManager.getInstance().init(this);
SkinManager.getInstance().load();
}
}


2. 在布局文件中标识需要换肤的View



...
xmlns:skin="http://schemas.android.com/android/skin"
...
<TextView
...
skin:enable="true"
... />


3. 继承
[Java] 查看源文件 复制代码
BaseActivity
或者
[Java] 查看源文件 复制代码
BaseFragmentActivity
作为BaseActivity进行开发



4. 从
[Java] 查看源文件 复制代码
.skin
文件中设置皮肤



String SKIN_NAME = "BlackFantacy.skin";
String SKIN_DIR = Environment.getExternalStorageDirectory() + File.separator + SKIN_NAME;
File skin = new File(SKIN_DIR);
SkinManager.getInstance().load(skin.getAbsolutePath(),
new ILoaderListener() {
@Override
public void onStart() {
}

@Override
public void onSuccess() {
}

@Override
public void onFailed() {
}
});


5. 重设默认皮肤



SkinManager.getInstance().restoreDefaultTheme();


6. 对代码中创建的View的换肤支持



主要由

[Java] 查看源文件 复制代码
IDynamicNewView
接口实现该功能,在
[Java] 查看源文件 复制代码
BaseActivity
[Java] 查看源文件 复制代码
BaseFragmentActivity
[Java] 查看源文件 复制代码
BaseFragment
中已经实现该接口.



public interface IDynamicNewView {
void dynamicAddView(View view, List<DynamicAttr> pDAttrs);
}


用法:动态创建View后,调用

[Java] 查看源文件 复制代码
dynamicAddView
方法注册该View至皮肤映射表即可(如下).详见sample工程



    private void dynamicAddTitleView() {
TextView textView = new TextView(getActivity());
textView.setText("Small Article (动态new的View)");
RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
param.addRule(RelativeLayout.CENTER_IN_PARENT);
textView.setLayoutParams(param);
textView.setTextColor(getActivity().getResources().getColor(R.color.color_title_bar_text));
textView.setTextSize(20);
titleBarLayout.addView(textView);

List<DynamicAttr> mDynamicAttr = new ArrayList<DynamicAttr>();
mDynamicAttr.add(new DynamicAttr(AttrFactory.TEXT_COLOR, R.color.color_title_bar_text));
dynamicAddView(textView, mDynamicAttr);
}


7. 皮肤包是什么?如何生成?


  • 皮肤包(后缀名为
    [Java] 查看源文件 复制代码
    .skin
    )的本质是一个apk文件,该apk文件不包含代码,只包含资源文件

  • 在皮肤包工程中(示例工程为
    [Java] 查看源文件 复制代码
    skin/BlackFantacy
    )添加需要换肤的同名的资源文件,直接编译生成apk文件,再更改后缀名为
    [Java] 查看源文件 复制代码
    .skin
    j即可(防止用户点击安装)

  • 使用gradle的同学,build
    [Java] 查看源文件 复制代码
    android-skin-loader-skin
    工程后即可在
    [Java] 查看源文件 复制代码
    skin-package
    目录下取皮肤包(修改脚本中
    [Java] 查看源文件 复制代码
    def skinName = \"BlackFantacy.skin\"
    换成自己想要的皮肤名)



相关源码推荐:

我来说两句
所有评论(53)
橘子汽水1009 2016-7-7 11:42:07
一个通过动态加载本地皮肤包进行换肤的皮肤框架
回复
橘子汽水1009 2016-7-7 11:42:17
楼主用心了,内容非常精彩。
回复
subsoil 2016-7-7 12:21:28
膜拜大神~
回复
rebecca 2016-7-7 13:07:45
帮帮顶顶!!
回复
fancy 2016-7-7 13:22:37
好好 学习了 确实不错
回复
ILI 2016-7-7 13:55:57
感谢分享,楼主V5~
回复
设女郎 2016-7-7 14:29:57
感谢分享,安卓巴士有你更精彩:lol
回复
2616 0 0
代码贡献英雄榜
用户名 下载数
联系我们
首页/微信公众账号投稿
帖子代码编辑/版权问题
QQ:435399051,1294855032
如何获得代码达人称号?
如何成为签约作者?
领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )