在原作者换肤的肩膀上,拓展集成切换语言等功能,并且上传公共依赖库,方便大家引用。
AndroidStudio添加jCenter远程依赖到module里的build.gradle:
dependencies {
compile 'com.excellence:skinloader:1.2.2'
// 或者直接使用最新版本
// compile 'com.excellence:skinloader:+'
}
或者直接添加本地Library依赖
compile project(':QSkinLoaderlib')
- 继承BaseActivity
示例如org.qcode.qskinloader.sample.BaseActivity; 让每个界面支持换肤,需要实现ISkinActivity接口
- BaseActivity中开启换肤控制
/** * 告知当前界面是否支持换肤 * * @return {@code true}:支持换肤<br>{@code false}:不支持 */ @Override public boolean isSupportSkinChange() { return true; } /** * 告知当切换皮肤时,是否立刻刷新当前界面,减轻换肤时性能压力 * * @return {@code true}:立刻刷新<br>{@code false}:表示在界面onResume时刷新 */ @Override public boolean isSwitchSkinImmediately() { return false; } /** * true:默认支持所有View换肤,不用添加skin:enable="true",不想支持则设置skin:enable="false" * false:默认不支持所有View换肤,对需要换肤的View添加skin:enable="true" * * @return */ @Override public boolean isSupportAllViewSkin() { return true; }
两种方式,让View支持换肤框架
-
xml中添加标识
skin的命名空间
xmlns:skin="http://schemas.android.com/android/skin"
然后对所有需要换肤的View增加属性
<View skin:enable="true" />
-
动态创建标识
SkinManager .with(textview) .setViewAttrs(SkinAttrName.BACKGROUND, R.color.white) .addViewAttrs(SkinAttrName.TEXT_COLOR, R.color.black) .applySkin(false);
-
通过后缀查找当前应用中的资源,进行换肤
/** * 通过后缀查找本应用中的资源,换肤 * * @param skinIdentifier 后缀标识 * @param listener 监听换肤成功或失败 */ public void changeSkinBySuffix(String skinIdentifier, OnSkinChangeListener listener) { mIsSwitching = true; mIsDefaultMode = false; SkinManager.getInstance().loadSkin(skinIdentifier, new SuffixResourceLoader(mContext), new LoadSkinListener(listener)); }
-
通过包名、后缀,查找指定的已安装应用中的资源,进行换肤
/** * 通过包名、后缀查找指定的已安装应用中的资源,换肤 * * @param packageName 包名 * @param suffix 后缀标识 * @param listener 监听换肤成功或失败 */ public void changeSkinByPackageSuffix(String packageName, String suffix, OnSkinChangeListener listener) { mIsSwitching = true; mIsDefaultMode = false; SkinManager.getInstance().loadAPKSkin(packageName, suffix, new LoadSkinListener(listener)); }
-
恢复默认皮肤
/** * 通过APK、包名、后缀换肤的方式,恢复默认皮肤 * * @param listener 监听恢复成功或失败 */ public void restoreDefaultSkinByAPKOrPackageOrSuffix(OnSkinChangeListener listener) { mIsSwitching = true; mIsDefaultMode = true; SkinManager.getInstance().restoreDefault(SkinConfigHelper.DEFAULT_SKIN, new LoadSkinListener(listener)); }
-
首先切换语言配置
Configuration config = getResources().getConfiguration(); switch (position) { case 0: config.locale = Locale.ENGLISH; break; case 1: config.locale = Locale.CHINESE; break; } getResources().updateConfiguration(config, getResources().getDisplayMetrics());
-
然后进行切换语言
/** * 通过指定包名、后缀查找已安装应用中的资源,切换语言 * * @param packageName 包名 * @param suffix 后缀标识 * @param listener 监听换肤成功或失败 */ public void changeLanguageConfigByPackageSuffix(String packageName, String suffix, OnSkinChangeListener listener) { mIsSwitching = true; mIsDefaultMode = false; String local = mContext.getResources().getConfiguration().locale.toString(); SkinManager.getInstance().loadLanguageSkin(packageName, local, suffix, new LoadSkinListener(listener)); }
-
传入标识
String suffix = ""; switch (v.getId()) { case R.id.small_text: suffix = "_small"; break; case R.id.normal_text: suffix = "_normal"; break; case R.id.big_text: suffix = "_big"; break; } SkinChangeHelper.getInstance().changeSizeSkinByPackageSuffix(getPackageName(), suffix, new SkinChangeHelper.OnSkinChangeListener() { @Override public void onSuccess() { Toast.makeText(SkinTextSizeActivity.this, "字体大小切换成功", Toast.LENGTH_SHORT).show(); } @Override public void onError() { Toast.makeText(SkinTextSizeActivity.this, "字体大小切换失败", Toast.LENGTH_SHORT).show(); } });
-
切换字体大小
/** * 通过指定包名、后缀查找已安装应用中的资源,切换字体大小 * * @param packageName 包名 * @param suffix 后缀标识 * @param listener 监听换肤成功或失败 */ public void changeSizeSkinByPackageSuffix(String packageName, String suffix, OnSkinChangeListener listener) { mIsSwitching = true; mIsDefaultMode = false; SkinManager.getInstance().loadSizeSkin(packageName, suffix, new LoadSkinListener(listener)); }
- 不支持保存换肤、切换语言,重启应用会恢复默认皮肤和语言,需要自行恢复已保存的皮肤和语言
版本 | 描述 | 日期 |
---|---|---|
1.2.2 | 优化换肤、换语言、换字体,减少资源未找到的异常抛出 | 2017-7-14 |
1.2.1 | 是否默认支持所有的View换肤 | 2017-5-18 |
1.2.0 | 集成TextView切换字体大小功能,支持弹窗里TextView字体大小切换 | 2017-5-18 |
1.1.0 | 切换语言,切换Activity、Fragment、弹窗里TextView文本语言 | 2017-5-15 |
1.0.0 | 换肤,切换Activity、Fragment、弹窗里View的背景、颜色、图片 | 2017-5-12 |