2 baidu 37299572 baidu_37299572 于 2017.01.12 10:16 提问

安卓如何自动更新资源文件?实现切换主题 皮肤

我想的实现方法是先设置好一个皮肤路径 然后imageView.setImageResource(loadfrompath/XXX.PNG)然后现在想直接把这个path改变实现换肤,想请教一下如何实现,在不重启的情况下,求指点。。。让这个imageView.setImageResource自动更新

3个回答

yangjiabei_0301
yangjiabei_0301   2017.01.12 10:51

如果你的皮肤图片文件是在项目的资源文件中存的,不是在数据库中存的
假如你有两套皮肤,你可以在数据库中设置一个开关字段,在程序中进行判断,
比如:
1.开关是TRUE的话展示默认的样式,开关是FALSE的话展示圣诞节的皮肤
你可以判断通过判断开关在程序自动的调用不同资源路径下的皮肤文件这是一个方法!这样依旧可以在不重启的情况下,手动该数据的开关,
实现皮肤的切换!
2.如果你对数据库不熟悉可以,或者其他的条件不允许你修改数据库,你也可以在程序中运用时间,判定在什么时候运用那套皮肤,
大致意思就是,判断系统时间在不在你需要的时间段内,在的话就调用圣诞节的皮肤,不在的话就调用默认的皮肤!这种方法不需要更改数据库,
也不需要改资源文件,缺点也很明显,你的项目要提前准备好所需要的资源文件,会增加你的项目体积,程序一旦写好了,就不能在动态的更改了!
3.一般我会采用的方式是,把皮肤用到的资源文件和开关同时存储在数据库中,把图片放在服务器上,通过请求服务的方式获取到本地,把默认的
皮肤文件和节日的或者其他的皮肤都放在数据库里,在客服端请求获取,这样就既减少可项目的体积,皮肤的配置也变得可以动态修改,需要改变
皮肤的时候只需要替换数据库中响应的文件就和改开关就行了!
我的大体实现方法是这样的,你可以根据你的具体环境看怎么处理!

baidu_37299572
baidu_37299572 嗯。。。现在我的问题是我把路径换了以后图片并没有更新,要重启才可以。。我是没有数据库的 通过加载不同的资源文件夹实现换肤,但是如果程序编译好了 这时候改拂去资源文件路径或者把原来读取的文件夹里的资源图片删了,UI是没有更新的
一年多之前 回复
Kelley_cfy
Kelley_cfy   2017.01.12 14:20

实现皮肤干嘛要这样做, 你需要一个ThemeManager, 里面负责监听皮肤的更改, 一旦发生更改就会回调到每一个注册了监听的Activity中, 然后重新获取Drawable, 刷新显示

Kelley_cfy
Kelley_cfy 回复ZWate: 回复在下面
一年多之前 回复
Kelley_cfy
Kelley_cfy 回复ZWate: 你可以先学习下插件的技术, 其实一个皮肤就是相当于一个资源包, 包里面有你所有需要的图片或者XML资源, 程序里只需要知道当前是哪个皮肤, 然后去读取指定皮肤资源包中的图片
一年多之前 回复
baidu_37299572
baidu_37299572 一旦发生更改就会回调到每一个注册了监听的Activity中, 然后重新获取Drawable, 刷新显示,能简单用代码说明一下吗,怎么回掉怎么重新获取Drawable,求指点啊大神
一年多之前 回复
Kelley_cfy
Kelley_cfy   2017.01.12 15:01

/**
* 获取某个Drawable 如果不存在则获取defaultResId的Drawable
* 默认的主题必须存在
* @param resId
* @param defaultResId 必须在主题中声明
* @return
*/
public Drawable getThemeDrawable(int resId, int defaultResId){
try{
if(isDefaultTheme()){
return mThemeResource.getDrawable(resId);
} else {
String name = mContext.getResources().getResourceEntryName(resId);
int id = mThemeResource.getIdentifier(name, "drawable", getCurrentTheme());
if(id > 0){
return mThemeResource.getDrawable(id);
} else{
String defaultResName = mContext.getResources().getResourceEntryName(defaultResId);
int themeDefaultResid = mThemeResource.getIdentifier(defaultResName, "drawable", getCurrentTheme());
return mThemeResource.getDrawable(themeDefaultResid);
}
}
} catch (Throwable e){
if(Loger.isD()){
Loger.i(getClass().getSimpleName(), " getDrawable " + e.getMessage());
}
}
return mContext.getResources().getDrawable(resId);
}
比如这样, 皮肤是一个APK资源包, 根据当前设置的皮肤获取到当前的Resources, 然后用ImageView.setImageDrawable(getThemeDrawable()), 当皮肤发生改变的时候再调用ImageView.setImageDrawable(getThemeDrawable())这个就会刷新显示, 至于怎么调用刷新, 你可以看看设计模式里面的观察者模式

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
WPF动态修改皮肤
代码下载:http://download.csdn.net/detail/lh806732/8454189 1、效果 2、工程目录     2.1 如工程目录所示,在工程下创建Resources目录,并在Resources创建Themes目录用于存放主题资源。     2.2 在Themes目录下创建Default和Green资源文件,并修改相应的S
轻松实现Android 更换皮肤(主题)
目前很多app都具有换肤功能,可以根据用户自己的喜好定制自己的界面,比如新浪微博,网易新闻等等。今天这里我就是要介绍一种机制实现app换肤。 我找了几款app换肤的应用,换肤基本都是更换了界面的Icon,背景图片,背景色等等,基本没有遇到更换布局的,其实布局也是可以更换的,但是觉得没有必要。所以这篇文章讲解的换肤也是指换icon,背景图片等资源。 通过网络搜索我发现网上上提供了大概这么集中换肤机制:
Android 主题切换
介绍 所谓的多主题切换,就是能够根据不同的设定,呈现不同风格的界面给用户。想实现Android多套主题的切换,网络上方案已经很多了,也看了许多大神的实现方式,但心里总想着自己去实现一遍,就这么借鉴GitHub的开源实现了一个简单的android换肤框架。 实现的思路 通过LayoutInflaterCompat.setFactory方式,在onCreateView的回调中,解析每一个V
Android_切换主题或皮肤的实现方式
1.简介使用自定义主题或者皮肤,可以将相关配置(颜色、大小等等)放在一个新的apk压缩文件中,目录结构保持一致,该apk文件放在任意可以访问到的目录即可,类似/system/framework/framework-res.apk,可根据软件的需要动态的加载主题文件。这里只介绍这一种实现方式,别的方式有兴趣的可以自己研究。主要实例化AssetManager对象和Resources对象来实现的Asse
JQueryEasyUI学习笔记(十三) 更换主题皮肤
欢迎大家转载,转载请注明出处! 希望这个笔记对自己和大家有用,但是本人水平有限,如果出错的地方,希望大家指出,多多批评,谢谢! 今天是easyui框架主题更换: 官网主题下载:官网主题 当然我们要将下载下来的主题包放到easyui的themes文件夹下面,发现官网还有Metro风格的主题,很不错的; $(function () { var easyuiThe
easyui切换主题
easyui 1.4.2下载地址:点击打开链接 主题有十多个吧 jquery cookie下载地址:点击打开链接 首先页面肯定先导入easyui相关的: 相关界面,我定义了一个切换主题的 更换皮肤 default black
WPF动态切换皮肤
实现方法比较简单,动态的加载资源字典来实现切换皮肤 <Application x:Class="Samples.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/20
iOS App主题皮肤切换功能简介和具体实现详解 附有源码
1. 主题皮肤功能切换介绍 主题切换就是根据用户设置不同的主题,来动态改变用户的界面,通常会改变 navigationBar背景图片、 tabBar背景图片、 tabBar中的按钮的图片和选中的背景图片                 navigationItem.title 标题的字体颜色        UI中其他元素控件 2. 实现步骤 1. 首先将image图片、Sk
android进行主题切换不重启整个应用(style方式)
如何在android进行主题切换,关键点是如果不重启应用进行切换。 目前已知的Android处理主题的方式有三种: 一种是style,也是Android原生支持的模式;一种是apk方式,采用的是更换context获取资源,一种是zip方式,这种是开发起来最复杂,也是最原始的办法(一般不采用)。 之前的项目由于要做主题下载,所以只能采用apk方式,但是安装主题不太友好,不能静默安装
vue vue-cli 应用 实现换肤功能 主题切换
业务需求:根据不同的&quot;标识&quot; 加载应用时 自动更换主题需要的东西:vue-cli 全家桶 主要(vuex,vue-router),less ,webpack,两套同样目录结构的主题静态资源(css,图片)最终效果主题1:                                             主题2:   具体实现:                一、把所需要改变主题的vue组件中...