Giter VIP home page Giter VIP logo

android-skin's Introduction

Android-Skin

介绍

Android-Skin:极简单的android换肤框架,无缝支持第三方控件,一行代码即可换肤,集成成本极低, 提供丰富的API支持拓展,对业务代码几乎无入侵。

AndroidSkin.getInstance().saveSkinAndApply(skinFilePath, SkinLoader.ASSETS);

执行之后,app即完成换肤,你将看到华丽的换肤效果;

Demo

Usage

1、在 app/buil.gradle 添加

compile 'com.meiyou:android-skin:1.0.9'

2、初始化

在application oncreate 加入初始化代码

AndroidSkin.getInstance().init(this);

3、加载/恢复皮肤

加载皮肤

AndroidSkin.getInstance().saveSkinAndApply(apkFile, SkinLoader.ASSETS,null);

恢复默认皮肤

AndroidSkin.getInstance().clearSkinAndApply();

Know More

1、换肤控制粒度;

默认全app换肤,关闭换肤级别有:

关闭 activity 换肤

onCreate加入
AndroidSkin.getInstance().registerIgnoreSkinActivity(this)
在onDestory加入
AndroidSkin.getInstance().unRegisterIgnoreSkinActivity(this)

关闭 view 换肤

AndroidSkin.getInstance().registerIgnoreSkinView(view)

关闭 view 的某个属性换肤

AndroidSkin.getInstance().registerIgnoreSkinView(view,"background","textColor”)

2、多种加载皮肤方式

 //从Sd卡保存皮肤信息,不应用
 AndroidSkin.getInstance().saveSkin(apkFile);
 AndroidSkin.getInstance().saveSkin(apkFile, SkinLoader.SDCARD);
 
 //从Sd卡保存皮肤信息并立刻应用
 AndroidSkin.getInstance().saveSkinAndApply(apkFile,listener);
  
 //从assets保存皮肤信息,不应用
 AndroidSkin.getInstance().saveSkin(apkFile, SkinLoader.ASSETS);
 
  //从assets保存皮肤信息并应用
 AndroidSkin.getInstance().saveSkinAndApply(apkFile,SkinLoader.ASSETS,listener);
 
 //从sd卡保存皮肤信息并应用
 AndroidSkin.getInstance().saveSkinAndApply(apkFile,listener);
 AndroidSkin.getInstance().saveSkinAndApply(apkFile,SkinLoader.SDCARD,listener);

3、动态设置

由于换肤原理采用的是Hook LayoutInflater的方式,所以对于用户自己new 出来的View不具有动态换肤的效果 所以提供了一系列的API来满足这方面的需求;

获取相应的换肤资源,这里主要用于需要对Color或者Drawable进行操作的需求

AndroidSkin.getInstance().getSkinId();

AndroidSkin.getInstance().getSkinDrawable();

AndroidSkin.getInstance().getSkinColorDrawable()

AndroidSkin.getInstance().getSkinColorStateList();

AndroidSkin.getInstance().getSkinColor();        

手动设置换肤

AndroidSkin.getInstance().setBackgroundDrawable();

AndroidSkin.getInstance().setImageDrawable();

AndroidSkin.getInstance().setTextColor();

自定义属性换肤

AndroidSkin.getInstance().addCustomAttrSupport(R.attr.tv_border_color,
            new ICustAttrApplyForColorListener<TestView>() {

                @Override
                public void applyColor(int attrId, TestView view, ColorStateList color) {
                    view.setBorderColor(color.getDefaultColor());
                }
            });

Fragment换肤注意事项

fragment的onCrateView用来inflate的对象必须是AndroidSkin.getLayoutInflater();

4、打包皮肤包

和普通的打包apk包一样,将同名资源在对应的res文件夹下即可,具体请参考project的skinone和skintwo; 比如:

主app里TextView:android:textColor="R.color.white";其中

<color name="white">#ffffff</color>

则在换肤工程里res也加上white这个对应的换肤颜色即可

 <color name="white">#fffeee</color>

然后gradle clean assembleRelease生成apk,放到主app的assets下或者放到sd卡, 使用AndroidSkin加载皮肤即可生效

android-skin's People

Contributors

iceanson avatar yangshangqin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-skin's Issues

使用的一些问题

1 文章最后的那个gradle命令是怎么用的,是要cd到对应的那个皮肤module打出来吗,需不需要加../gradlew,我试了下好像都不行。
2 这个框架支持自定义View的自定义属性换肤吗,有的自定义view,他有自定义属性,属性就是设置颜色的,这个能换这个颜色吗。
3 我项目中有用到databinding,xml写的时候就会遇到

android:textColor="@{item.check?@color/common_label_blue_color:@color/common_tv_hint_color}"

这种情况就比较尴尬了,我试过几个皮肤框架,你这个会比其他的方便多了

小米pad上运行demo,换肤界面中EditText长按会崩溃

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.drawable.Drawable.setLevel(int)' on a null object reference
at android.widget.Editor$ActionPopupWindow.show(Editor.java:3721)
at android.widget.Editor$HandleView$2.run(Editor.java:4274)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5281)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)

引用工程后app崩溃

java.lang.NoSuchMethodError: android.support.v4.view.LayoutInflaterCompat.setFactory2
at com.meiyou.skinlib.AndroidSkinHook.hookLayoutInflater(AndroidSkinHook.java:73)
at com.meiyou.skinlib.AndroidSkinHook.access$100(AndroidSkinHook.java:17)
at com.meiyou.skinlib.AndroidSkinHook$1.onActivityCreated(AndroidSkinHook.java:32)
at android.app.Application.dispatchActivityCreated(Application.java:218)
at android.app.Activity.onCreate(Activity.java:917)
at com.example.module.IndexActivity.onCreate(IndexActivity.java:115)
at android.app.Activity.performCreate(Activity.java:5286)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2319)
at android.app.ActivityThread.access$1100(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1232)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5253)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:939)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
at dalvik.system.NativeStart.main(Native Method)

吐槽demo图

至少看起来和谐一点吧。Android Studio Editor有取色器,随便选个颜色值,它都有相应和谐的参考提供。或者参考Material Design啊...

找不到 setFactory2()

\Android-Skin-master\skinlib\src\main\java\com\meiyou\skinlib\AndroidSkinHook.java:73: 错误: 找不到符号
LayoutInflaterCompat.setFactory2(layoutInflater, AndroidSkinFactory.from(context,layoutInflater));
^
符号: 方法 setFactory2(LayoutInflater,AndroidSkinFactory)
位置: 类 LayoutInflaterCompat
注: 某些输入文件使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
注: 某些输入文件使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
1 个错误

FAILED

FAILURE: Build failed with an exception.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.