首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >android-主题引擎-实现换肤功能-Android-skin-support「 ximsfei 」

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

作者头像
圆号本昊
发布2021-09-24 12:19:55
发布2021-09-24 12:19:55
1.5K0
举报
文章被收录于专栏:github@hornhuanggithub@hornhuang

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

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


Demo 地址:

点击右边 ? :( 欢迎 star )


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

首先添加依赖

代码语言:javascript
复制
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{} 里加上这一句:

代码语言:javascript
复制
sourceSets {
    main {
        res.srcDirs = ['src/main/res', 'src/main/res-BlackFactory']
    }
}

开始使用

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

代码语言:javascript
复制
@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

代码语言:javascript
复制
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 )


测试换肤效果:

代码语言:javascript
复制
@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();
    // 指定皮肤插件, 并且监听加载状态
}

效果如下:


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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 突发奇想,给 app 加个换肤功能
  • Demo 地址:
  • 使用过程中踩坑无数,这里一一解释下
  • 开始使用
  • 运行之后我们发现毫无变化
  • 重点!!!
    • 已经设置成功,现在引入皮肤就可以使用
    • 皮肤的制作方法:点击跳转 -> https://blog.csdn.net/k393393/article/details/78781730
    • 皮肤引入:
    • 测试换肤效果:
    • 效果如下:
    • 如果对您有帮助,欢迎点赞~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档