Android-skin-support is an easy to use dynamic skin framework for Android, Only one line of code to integrate it.一款用心去做的Android 换肤框架, 极低的学习成本, 极好的用户体验. 一行代码就可以实现换肤, 你值得拥有!!!

Min SDK   14
Latest Commit   2017-11-07 07:08:57
License   MIT




Using app client to scan QR code to run Demo


beijing, china


KArchi Sample app showcases the MVP pattern and Uncle Bob Martin Clean Architecture approach.
YouTubePlayerActivity Android Youtube Player Activity. Simply pass a url to play youtube video in new activity. It supports screen orientation, media volume control and etc.
WindRoseDiagramView a view widget of WindRoseDiagram in android platform


In English | 中文

skin-support-v2.1.9 design-v1.2.5 cardview-v1.2.0 v1.0.2

circleimageview-v2.2.0.2 v2.1.2 v1.4.5

Android-skin-support is an easy to use skin framework for Android. The best case, Only one line of code to integrate the framework.


Now, you have a strong skinning feature. What you need to do is make a skin.

default app-in plug-in

Table of Contents

Gradle Dependencies

The Gradle Dependency is available via jCenter,

Add dependencies directly, For the latest version, please refer to change log

compile ''          // skin-support basic widget
compile ''   // skin-support-design material design support [selectable]
compile '' // skin-support-cardview CardView support [selectable]
compile '' // skin-support-constraint-layout ConstraintLayout support [selectable]



Only one line of code to integrate the framework.

public void onCreate() {
    SkinCompatManager.withoutActivity(this)                         // Basic Widget support
            .addStrategy(new CustomSDCardLoader())                  // Custom loader strategy            [selectable]
            .addHookInflater(new SkinHookAutoLayoutViewInflater())  // hongyangAndroid/AndroidAutoLayout [selectable]
            .addInflater(new SkinMaterialViewInflater())            // material design support           [selectable]
            .addInflater(new SkinConstraintViewInflater())          // ConstraintLayout support          [selectable]
            .addInflater(new SkinCardViewInflater())                // CardView v7 support               [selectable]
            .addInflater(new SkinCircleImageViewInflater())         // hdodenhof/CircleImageView         [selectable]
            .addInflater(new SkinFlycoTabLayoutInflater())          // H07000223/FlycoTabLayout          [selectable]
            .setSkinStatusBarColorEnable(false)                     // Disable statusBarColor skin support,default true   [selectable]
            .setSkinWindowBackgroundEnable(false)                   // Disable windowBackground skin support,default true [selectable]

Load Skin

// Load the specified skin
SkinCompatManager.getInstance().loadSkin(""[, SkinLoaderListener], int strategy);

// restore default skin

Custom View skin support

  1. Implement the SkinCompatSupportable interface

  2. Apply skin resource in the applySkin method

  3. Resolve the skin resource id in the constructor

Make a skin

BuildIn Skin:

BuildIn Skin,if the skin name is night; Add a resource that needs to be skinned with a suffix _night or prefix night_.

if the default resource is R.color.windowBackgroundColor, then you can add a resource R.color.windowBackgroundColor_night

load buildIn skin:

SkinCompatManager.getInstance().loadSkin("night", SkinCompatManager.SKIN_LOADER_STRATEGY_BUILD_IN); // load by suffix
SkinCompatManager.getInstance().loadSkin("night", SkinCompatManager.SKIN_LOADER_STRATEGY_PREFIX_BUILD_IN); // load by prefix

Plug-in Skin:

New Android Application Project

Put the skin resources into the res directory

If the original window background is


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

for night-mode you can add this in the skin-night project


<color name="background">#000000</color>

Generated apk is the skin package

You can rename night.apk to by yourself.

Load plug-in skin package

You can put the skin package into the assets/skins directory.

SkinCompatManager.getInstance().loadSkin("night", SkinCompatManager.SKIN_LOADER_STRATEGY_ASSETS);

Or you can customize the loading strategy:

For example:

Inherit from SkinSDCardLoader,Rewrite the getSkinPathgetType methods。

public class CustomSDCardLoader extends SkinSDCardLoader {
    public static final int SKIN_LOADER_STRATEGY_SDCARD = Integer.MAX_VALUE;

    protected String getSkinPath(Context context, String skinName) {
        return new File(SkinFileUtils.getSkinDir(context), skinName).getAbsolutePath();

    public int getType() {

Register this strategy in Application's onCreate

SkinCompatManager.withoutActivity(this).addStrategy(new CustomSDCardLoader());

Use this strategy to load skin:

SkinCompatManager.getInstance().loadSkin("", null, CustomSDCardLoader.SKIN_LOADER_STRATEGY_SDCARD);

About Author

Pengfeng Wang(王鹏锋)


License MIT