android-主题引擎-实现换肤功能-Android-skin-support「 ximsfei 」

博客介绍了给 Android app 添加换肤功能的方法。作者分享了使用 Android-skin-support 三方库实现换肤的过程,包括添加依赖、为活动实现接口等步骤,还提到了运行无变化的解决办法,给出了皮肤制作和引入的方法及相关链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

突发奇想,给 app 加个换肤功能

三方库地址--https://github.com/ximsfei/Android-skin-support#应用内换肤


Demo 地址:

点击右边 ? :( 欢迎 star )


使用过程中踩坑无数,这里一一解释下

首先添加依赖

implementation 'skin.support:skin-support:3.1.1'                   // skin-support 基础控件支持
implementation 'skin.support:skin-support-design:3.1.1'            // skin-support-design material design 控件支持[可选]
implementation 'skin.support:skin-support-cardview:3.1.1'          // skin-support-cardview CardView 控件支持[可选]
implementation 'skin.support:skin-support-constraint-layout:3.1.1' // skin-support-constraint-layout ConstraintLayout 控件支持[可选]

记得在 android{} 里加上这一句:

sourceSets {
    main {
        res.srcDirs = ['src/main/res', 'src/main/res-BlackFactory']
    }
}

开始使用

首先在有需要换肤控件的活动里加上这段

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    navView = findViewById(R.id.nav_view);
    mTextMessage = findViewById(R.id.message);
    navView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);


    SkinCompatManager.withoutActivity(getApplication())                         // 基础控件换肤初始化
            .addInflater(new SkinMaterialViewInflater())            // material design 控件换肤初始化[可选]
            .addInflater(new SkinConstraintViewInflater())          // ConstraintLayout 控件换肤初始化[可选]
            .addInflater(new SkinCardViewInflater())                // CardView v7 控件换肤初始化[可选]
            .setSkinStatusBarColorEnable(false)                     // 关闭状态栏换肤,默认打开[可选]
            .setSkinWindowBackgroundEnable(false)                   // 关闭windowBackground换肤,默认打开[可选]
            .loadSkin();

}

运行之后我们发现毫无变化

这是因为我们需要为当前活动实现 SkinCompatSupportable 接口--> implements SkinCompatSupportable

public class MainActivity extends BaseActivity implements SkinCompatSupportable {
    private boolean flag = true;
    private TextView mTextMessage;
    private BottomNavigationView navView;
    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    mTextMessage.setText(R.string.title_home);
                    return true;
                case R.id.navigation_dashboard:
                    mTextMessage.setText(R.string.title_dashboard);
                    return true;
                case R.id.navigation_notifications:
                    mTextMessage.setText(R.string.title_notifications);
                    return true;
            }
            return false;
        }
    };

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    navView = findViewById(R.id.nav_view);
    mTextMessage = findViewById(R.id.message);
    navView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);


    SkinCompatManager.withoutActivity(getApplication())                         // 基础控件换肤初始化
            .addInflater(new SkinMaterialViewInflater())            // material design 控件换肤初始化[可选]
            .addInflater(new SkinConstraintViewInflater())          // ConstraintLayout 控件换肤初始化[可选]
            .addInflater(new SkinCardViewInflater())                // CardView v7 控件换肤初始化[可选]
            .setSkinStatusBarColorEnable(false)                     // 关闭状态栏换肤,默认打开[可选]
            .setSkinWindowBackgroundEnable(false)                   // 关闭windowBackground换肤,默认打开[可选]
            .loadSkin();

}

    @Override
    public void applySkin() {
        mTextMessage.setBackgroundDrawable(SkinCompatResources.getInstance().getDrawable(R.drawable.textview_bac));
        navView.setBackgroundDrawable(SkinCompatResources.getInstance().getDrawable(R.drawable.bottom_navigation_view_bac));
    }

}

重点!!!

已经设置成功,现在引入皮肤就可以使用

我自定义的垃圾皮肤下载:https://github.com/FishInWater-1999/android-skin-change-applicatiom/tree/master/app/src/main/assets/skins

皮肤的制作方法:点击跳转 -> https://blog.csdn.net/k393393/article/details/78781730


皮肤引入:

在 src/main/ 下新建 /assets/skins 文件夹,将皮肤文件拖入(记得皮肤后缀 .skin )


测试换肤效果:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    navView = findViewById(R.id.nav_view);
    mTextMessage = findViewById(R.id.message);
    navView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);


    SkinCompatManager.withoutActivity(getApplication())                         // 基础控件换肤初始化
            .addInflater(new SkinMaterialViewInflater())            // material design 控件换肤初始化[可选]
            .addInflater(new SkinConstraintViewInflater())          // ConstraintLayout 控件换肤初始化[可选]
            .addInflater(new SkinCardViewInflater())                // CardView v7 控件换肤初始化[可选]
            .setSkinStatusBarColorEnable(false)                     // 关闭状态栏换肤,默认打开[可选]
            .setSkinWindowBackgroundEnable(false)                   // 关闭windowBackground换肤,默认打开[可选]
            .loadSkin();

    mTextMessage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!flag){
                SkinCompatManager.getInstance().loadSkin("red.skin");
                flag = !flag;
            }else {
                SkinCompatManager.getInstance().loadSkin("blue.skin");
                flag = !flag;
            }
        }
    });
    SkinCompatManager.getInstance().loadSkin("red.skin");
// 指定皮肤插件
//        SkinCompatManager.getInstance().loadSkin("new.skin"[, SkinLoaderListener], int strategy);
//        SkinCompatManager.getInstance().loadSkin("night", SkinCompatManager.SKIN_LOADER_STRATEGY_PREFIX_BUILD_IN); // 前缀加载
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);// 恢复应用默认皮肤
//        SkinCompatManager.getInstance().restoreDefaultTheme();
    // 指定皮肤插件, 并且监听加载状态
}

效果如下:


如果对您有帮助,欢迎点赞~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值