突发奇想,给 app 加个换肤功能
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://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();
// 指定皮肤插件, 并且监听加载状态
}