1.用自己的Layout实现layout监听
public class SkinActivity implements Layout{
SkinLayoutInflater skinLayoutInflator;
protected void onCreate(Bundle saveInstanceState){
skinLayoutInflator = new SkinLayoutInflater();
LayoutInflaterCompat.setFactory(getLayoutoutInflater().skinLayoutInflater);
}
public void update(){
SkinManager.loadPath("skin.apk");
SkinManager.update();
}
}
2.实现自己的LayoutInflaterFactory
public class SkinLayoutInflater implements LayoutInflaterFactory{
SkinLayoutInflater skinLayoutInflater;
private
public View createView(View parent,String name,String Context,AttributeSet attrs){
View view = null;
if(name.indexOf(".")!=-1)){//自定义控件
view = createView(context,attrs,name);
}else{//反射构造系统控件
for(String pre:prefixList){
view = createView(context,attrs,pre+name);
if(view == null){break;}
}
}
}
//反射View
public View createView(String name,String Context,AttributeSet attrs){
Class viewClazz = context.getClassLoader().loadClass(name);
Contructor<? extends view> contructor = viewClazz.getContructor(new Class[](Context.class,AttrubuteSet.class));
contructor.setAccessible(true);
}
//对从apk插件中得到的颜色进行应用
public void apply(){
for(SkinItem skinItem :list){
if("textColor".equals(skinItem.getAttrName())){
if(view instanceof TextView){
((TextView)view).setTextColor(skinItem.getId());
}else{
((TextView)view).setTextColor(SkinManager.getInstance().getColor(skinItem.getId()));
}
}
}
}
//skinitem的包装类
class SkinItem{
private String attrName;
private String attrValue;
String String attrType;
int id;
}
private void parseView(Context context,AttributeSet attrs,View view,String name){
for(int i=0;i<attrs.getAttributeCount();i++){
String attrName = attrs.getAttributeName(i);
String attrValue = attrs.getAttributeValue(i);
if("background".equal(attrName)||"textColor".equal(attrName)){
int id = Integer.parseInt(attrValue.substring(1));
String entryName = context.getResources().getResourceEntryName(id);
String typeName = context.getResources().getResourceTypeName(id);
SkinItem skinItem =new SkinItem(attrName,id,entryName,typeName);
list.add(skinItem);//收集换肤的ITem
}
}
if(!list.isEmpty){
SkinView skinview = new SkinView
}
}
class SkinManager{
private Context context;
private Resource skinResource;
private String skinPackageName;
private static SkinManager ourInstance = new SkinManager();
public SkinManager(){
}
public static SkinManager getInstance(){return ourInstance;}
public void init(Context context){
this.context = context.getApplicationContext();
}
//加载apk路径
public void loadSkin(File apkPath){
PackageManager packageManager = coontext.getPackageManager();
PackageInfo packageInfo = packageManager.getPackagerArchiveInfo(apkPath.getAbsolutePath,PackageManager.GET_ACTIVITIE);//这里很重要,根据packageManage来加载apk包信息和包资源
skinPackageName = packageInfo.packageName;
AssetManager assetManager = AssetManager.class.newInstance();
Method addAssetPath()=assetManager.getClass.getClass.getMethod("addAssetPath",String.class);
addAssetPath.invoke(assetManager.apkPath.getAbsoluteFile());
skinResource = new Resource(assetManager,context.getResources().getDisplayMetries,context.getResources().getContext);
}
//对每个View进行更新
public void update(){
for(View view : cacheMap.keySet()){
SkinView skinitem = cacheMap.get(view);
skinItem.apply();
}
}
public int getColor(int resId){
if(skinResource == null){
return resId;
}
String resName = context.getResources().getResoucesEntryName(resId);//得到资源名
int skinId = skinResource.getIndentifier(resName,"color",skinPackageName);//通过资源名去拿到皮肤ID
return skinResource.getColors(resId);
}
}
class SkinView{
private View view;
private List<SkinItem> list;
public SkinView(View view,List<SkinItem> list>) {
this.view = view;
this.list = list;
}
//将ViewItem里面需要换肤的进行更新
public void apply(){
for(SkinItem skinItem :list){
if("textColor".equals(skinItem.getAttrName())){
if(view instanceof TextView){
(TextView)view .setTextColor(skinItem.getId());
}else if(view instanceof Button){
(TextView)viwe.setTextColor(skinItem.getId);
}
}
}
}
}
}
相关推荐
在移动应用开发中,app换肤功能是一种常见的需求,它能提供给用户个性化的体验,增强用户对应用的喜好度。本篇文章将深入探讨如何通过修改`R.mipmap.test`文件来实现这一功能,让读者了解app换肤的基本原理。 首先...
在IT行业中,用户界面(UI)的个性化设计已经成为吸引用户...总之,换肤功能的实现是一个综合了资源管理、动态渲染、事件处理等多个技术领域的挑战,但通过合理的架构设计和优化,可以为用户提供更加个性化的使用体验。
7. **测试与调试**:在开发过程中,对各个版本的设备进行充分的测试是非常必要的,确保在各种环境下换肤功能都能正常工作,无异常或视觉问题。 8. **用户界面响应**:换肤过程中应保持用户界面的流畅性,尽量避免...
在本文中,我们将深入探讨如何使用Qt框架实现应用程序的换肤功能。Qt是一个跨平台的C++库,广泛用于开发图形用户界面应用。通过利用Qt的样式表(QSS,Qt Style Sheets)特性,我们可以轻松地改变应用的外观和感觉,...
在本文中,我们将深入探讨如何在基于Windows Presentation Foundation(WPF)的客户端应用程序(CS结构桌面程序)中实现换肤功能。WPF是.NET Framework的一部分,它提供了丰富的用户界面(UI)设计工具和功能,使得...
该资源是 Android 应用实现换肤功能的demo程序,同时也是博客文章:http://blog.csdn.net/janice0529/article/details/39999727 中demo程序, 博客中有详细的demo程序设计介绍。
在实现app内置换肤功能时,还要考虑性能优化。例如,使用内存缓存来存储已加载的皮肤资源,减少重复加载;同时,对于大图资源,可以采用懒加载策略,只在需要时才加载,防止内存占用过高。 最后,为了提供良好的...
换肤功能是现代移动应用提升用户体验的重要手段,它不仅涵盖了全局主题的更换,如节假日主题切换,还包括局部页面的个性化设置,如白天/夜间模式。iOS系统自iOS13开始引入暗黑模式,为实现动态换肤提供了基础。本文...
本文将深入探讨如何实现一个Android app的主题换肤功能,基于提供的"app主题换肤的demo"。 首先,理解主题换肤的基本概念。在Android中,主题(Theme)是指一套全局的UI风格,包括颜色、字体、布局等元素。通过更换...
在微信小程序中实现换肤功能是一项常见的需求,它允许用户根据个人喜好选择不同的主题颜色或样式。微信小程序的开发方式与传统的PC或移动端有所不同,因此实现换肤功能时需要采用特殊的方法。以下将详细介绍如何在...
Android软件的换肤功能,也称为AppTheme,是提升用户体验的一种常见方式,它允许用户根据个人喜好调整应用的视觉风格,如边框图片、颜色、字体样式和大小等。尤其在阅读类应用中,例如小说软件,用户可以切换背景色...
- **代码实现**:通常,换肤功能的实现需要编写一段代码,用于监听用户选择的主题并进行资源的切换。这部分代码可以放在一个专门的`SkinManager`类中,该类负责加载和切换皮肤资源。 - **兼容性问题**:考虑到...
在React应用中实现换肤功能是一项常见的需求,它允许用户根据个人喜好选择不同的主题颜色,提升用户体验。本文将详细介绍如何在React中实现这一功能,并提供一个具体的示例代码。 一、目标 目标是为用户提供几种...
iOS实现换肤功能的简单处理框架 ...使用本框架可以实现换肤功能的简单处理,可以提供更好的用户体验,提高APP的可用性和灵活性。同时,本框架也可以扩展到其他的功能模块中,例如夜间模式、暗黑模式等。
本实例将探讨如何在后台框架页面中实现换肤功能,并且能够保存用户的设置,以便下次打开时仍然保持用户的首选样式。这一功能通常涉及到前端开发、后端存储以及用户交互设计等多个方面。 首先,我们来理解"框架页面...
在本文中,我们将探讨如何使用Vue.js、iView和Less实现一个动态换肤功能。Vue.js是一个流行的前端框架,iView是一个基于Vue的UI组件库,而Less是一种预处理器CSS语言,它允许我们编写更简洁、可维护的样式代码。以下...
1、资料包括安卓app源代码和产品设计说明相关文档,有助于理解整个app设计开发过程。 2、资源内容:安卓app框架源代码文档 3、使用/学习目标:了解移动开发核心原理 4、应用场景:安卓编程,项目产品化、资源处理等内容...
### MIUI主题风格——一种Android系统换肤功能的设计思路 #### 一、引言 随着移动设备的普及和发展,用户体验成为软件开发中的一个重要考量因素。其中,个性化设置,特别是主题风格的定制化服务,越来越受到用户的...