- 浏览: 5776706 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
一直很想弄清楚好多应用中是如何实现换皮肤这项功能的,花了下午点时间,查了下资料也实现了个切换主题的Demo;
首先要感谢下这位大哥,参阅了下他写的文件http://www.eoeandroid.com/forum-viewthread-tid-31756-highlight-%E7%9A%AE%E8%82%A4.html
好了,废话不多说了,该切换主题的demo里面一共实现了两个功能,其一,搜索已经安装的皮肤,其二,应用安装的皮肤。
主项目包名为org.leepood.skindemo,主题项目的包名为org.leepood.skin.blue,org.leepood.skin.red,等等,只要前缀是org.leepood.skin.就行。
首先是查找已安装主题的代码:
这段代码的含义就是去查找系统中安装的包名,若以org.leepood.skin.开头则说明该包为主题包,将其加入listview中显示出来。代码中使用了多线程避免时间过长堵塞UI。程序将当前主题配置保存在SharedPreference中,为SharedPreference注册了一个监听函数,当其值发生改变时自动调用新的样式。当然,这只是个demo而已,一开始加载Activity没有去读取主题,这个可以由大家自己去实现。
最后贴张图片:
Android实现主题切换机制2
昨天花了点时间实现了主题的切换,但是里面还是不够灵活,回去想了想可以用继承和回调函数来进一步灵活更改主题,现在记录下我的实现办法
首先一个自定义类ThemeActivity继承自Activity,这个类是以后所有Activity的父类,在这个类里面定义了一个接口
public interface OnThemeChangedListener
{
public void onChanged(String newThemePackageName);
}
接下来,首先是要给ThemeActivity注册一个主题切换的listener,代码如下:
public void setOnThemeChangedListener(OnThemeChangedListener listener)
{
this.listener=listener;
}
然后就是注册一个SharedPreference来监听xml的变化,当发生改变的时候自动去调用listener.onChanged方法,将新的主题包名传递过去,代码如下:
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
if(key.equals("themePackage"))
{
listener.onChanged(sp.getString("themePackage", ""));
}
}
接着在继承于ThemeActivity的子类里面首先是setOnThemeChangedListener.接着用一个匿名内部类搞定。好啦,代码可以见附件啦
首先要感谢下这位大哥,参阅了下他写的文件http://www.eoeandroid.com/forum-viewthread-tid-31756-highlight-%E7%9A%AE%E8%82%A4.html
好了,废话不多说了,该切换主题的demo里面一共实现了两个功能,其一,搜索已经安装的皮肤,其二,应用安装的皮肤。
主项目包名为org.leepood.skindemo,主题项目的包名为org.leepood.skin.blue,org.leepood.skin.red,等等,只要前缀是org.leepood.skin.就行。
首先是查找已安装主题的代码:
package org.leepood.skindemo; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnCreateContextMenuListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.AdapterView.AdapterContextMenuInfo; public class Main extends Activity implements SharedPreferences.OnSharedPreferenceChangeListener{ private ListView listview; private Context c; private Handler mHandler; private ProgressDialog pDialog; private SkinAdapter adapter; private SharedPreferences sp; static final int MESSAGE_SEARCHED_SKIN=0; static final int MESSAGE_SEARCHING_SKIN=MESSAGE_SEARCHED_SKIN+1; static final int MESSAGE_SEARCHED_SKIN_FOR_NONTHING=MESSAGE_SEARCHING_SKIN+1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); pDialog.show(); new Thread(serachSkin).start(); } private void init() { c=this; mHandler=new Handler(){ @Override public void handleMessage(Message msg) { switch(msg.what) { case MESSAGE_SEARCHED_SKIN: ArrayList skins=(ArrayList ) msg.obj;//获取skins adapter=new SkinAdapter(c, skins); listview.setAdapter(adapter); Toast.makeText(c, "查找到已经安装的皮肤", 1).show(); pDialog.dismiss(); break; case MESSAGE_SEARCHED_SKIN_FOR_NONTHING: Toast.makeText(c, "未查找到任何皮肤", 1).show(); pDialog.dismiss(); } } }; sp=this.getSharedPreferences("config",Context.MODE_WORLD_WRITEABLE); sp.registerOnSharedPreferenceChangeListener(this); listview=(ListView) findViewById(R.id.list); listview.setItemsCanFocus(false); listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE); pDialog=new ProgressDialog(this); pDialog.setMessage("正在查找已经安装的皮肤"); listview.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.add("使用该主题"); } }); } private Runnable serachSkin =new Runnable(){ public void run() { PackageManager manager=c.getPackageManager(); List packages=manager.getInstalledPackages(PackageManager.PERMISSION_GRANTED); ArrayList skins=new ArrayList (); for(PackageInfo info:packages) { //System.out.println(info.packageName); if(info.packageName.startsWith("org.leepood.skin.")) { skins.add(info); } } if(skins.size()>0) { Message msg=mHandler.obtainMessage(); msg.obj=skins; msg.what=MESSAGE_SEARCHED_SKIN; mHandler.sendMessage(msg); } else { mHandler.sendEmptyMessage(MESSAGE_SEARCHED_SKIN_FOR_NONTHING); } } }; private class SkinAdapter extends BaseAdapter { LayoutInflater mInflater; ArrayList datas; PackageManager manager; public SkinAdapter(Context c,ArrayList datas) { this.datas=datas; mInflater=LayoutInflater.from(c); manager=c.getPackageManager(); } public int getCount() { return datas.size(); } public Object getItem(int position) { return datas.get(position); } public long getItemId(int position) { return 0; } public View getView(int position, View convertView, ViewGroup parent) { if(convertView==null) { convertView=mInflater.inflate(R.layout.skin_item, null); } ImageView icon=(ImageView) convertView.findViewById(R.id.skin_icon); TextView skin_name=(TextView) convertView.findViewById(R.id.skin_name); PackageInfo info=datas.get(position); icon.setImageDrawable(info.applicationInfo.loadIcon(manager)); skin_name.setText(info.applicationInfo.loadLabel(manager)); return convertView; } } public void onThemeChanged(String newThemePackageName) { try { Context themeContext=this.createPackageContext(newThemePackageName, CONTEXT_IGNORE_SECURITY); Resources res=themeContext.getResources(); setControlsStyle(res); } catch (NameNotFoundException e) { e.printStackTrace(); } } private void setControlsStyle(Resources res) { listview.setBackgroundColor(res.getColor(R.color.ListView_bg)); } @Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo menuInfo=(AdapterContextMenuInfo)item.getMenuInfo(); PackageInfo info=(PackageInfo) adapter.getItem(menuInfo.position); sp.edit().putString("themePackage", info.packageName).commit(); return super.onContextItemSelected(item); } public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { System.out.println("themeChange"); onThemeChanged(sharedPreferences.getString(key, "")); } }
这段代码的含义就是去查找系统中安装的包名,若以org.leepood.skin.开头则说明该包为主题包,将其加入listview中显示出来。代码中使用了多线程避免时间过长堵塞UI。程序将当前主题配置保存在SharedPreference中,为SharedPreference注册了一个监听函数,当其值发生改变时自动调用新的样式。当然,这只是个demo而已,一开始加载Activity没有去读取主题,这个可以由大家自己去实现。
最后贴张图片:
Android实现主题切换机制2
昨天花了点时间实现了主题的切换,但是里面还是不够灵活,回去想了想可以用继承和回调函数来进一步灵活更改主题,现在记录下我的实现办法
首先一个自定义类ThemeActivity继承自Activity,这个类是以后所有Activity的父类,在这个类里面定义了一个接口
public interface OnThemeChangedListener
{
public void onChanged(String newThemePackageName);
}
接下来,首先是要给ThemeActivity注册一个主题切换的listener,代码如下:
public void setOnThemeChangedListener(OnThemeChangedListener listener)
{
this.listener=listener;
}
然后就是注册一个SharedPreference来监听xml的变化,当发生改变的时候自动去调用listener.onChanged方法,将新的主题包名传递过去,代码如下:
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
if(key.equals("themePackage"))
{
listener.onChanged(sp.getString("themePackage", ""));
}
}
接着在继承于ThemeActivity的子类里面首先是setOnThemeChangedListener.接着用一个匿名内部类搞定。好啦,代码可以见附件啦
评论
5 楼
a13429921973
2013-09-27
接口回调真是酷毙了
4 楼
hack_zhang
2013-08-16
感谢楼主分享 一会运行一下项目再来评价哈。。
3 楼
lrq851215
2013-03-26
先下来看看,谢谢啦
2 楼
xiangdream
2012-03-14
good
1 楼
逍遥天下
2012-02-16
哈哈··谢谢群主啊
发表评论
-
利用广播实现强制下线功能
2016-12-28 10:45 1423最近一口气买 ... -
Android百分比布局Percent支持库
2015-09-02 11:08 3104虽然有很多的布局可以在 Android 应用程序开发的世界供我 ... -
ViewDragHelper行为测试
2015-08-12 17:36 2694只是简单记录一下 以后可能会实现一些效果 import ... -
android5.x之Palette调色板
2015-07-17 10:30 3295Palette类可以分析一张图片,取出这张图片的特征色,然后为 ... -
使用ClipboardManager剪贴板实现复制粘贴功能
2015-04-10 14:39 3737经常要使用复制粘贴的功能,比如长安一个TextView弹出一个 ... -
LocationListener监听位置变化,当进入到某一距离内时发出提醒
2014-08-19 15:03 7631项目中需要这样的要求: 启动一个服务一直在背后监听当前位置变化 ... -
Android下集成FacebookSDk到项目并发表评论
2013-08-28 14:36 4830项目中需要发表自己的评论到Facebook,需要集成Faceb ... -
MediaRecorder录音,MediaPlayer播放
2013-05-23 09:53 7471直接看代码 import java.io.DataOutp ... -
Notification的基本用法
2013-05-22 11:52 5916android4.0以前: private static ... -
android音频、视频、拍照基础操作
2013-03-27 11:55 2767播放音乐和视频用的是类:MediaPlayer 刻录声音和视 ... -
tabhost通过手势滑动切换activity
2013-02-18 17:59 11103package com.mars.mp3player; ... -
VideoView简单视频播放
2013-02-17 17:17 9245只是上上手而已的例子。 package com.chen ... -
android 再按一次后退键退出应用程序
2012-06-15 21:51 4062private static Boolean isExit ... -
AlarmManager全局定时器/闹钟
2012-02-01 10:11 5823http://407827531.iteye.com/blog ... -
倒计时的CountDownTimer
2011-12-23 13:06 31145直接看这里吧,我只是搬运工。 定时执行在一段时候后停止的倒计 ... -
Android流量统计TrafficStats类的使用
2011-12-06 16:25 26389对于Android流量统计来说在2.2版中新加入了Traffi ... -
ScrollView当显示超出当前页面时自动移动到最底端
2011-09-01 09:42 16950卷轴视图(ScrollView)是指当拥有很多内容,一屏显示不 ... -
在SurfaceView上拖动一架飞机
2011-08-23 12:40 2880接上一篇在SurfaceView上拖动一张小图片 什么叫拖动飞 ... -
在SurfaceView上拖动一张小图片
2011-08-22 18:20 5192用手指随便拖。这里采用了线程去绘制,其实也可以在onTouch ... -
用getIdentifier()获取资源Id
2011-07-28 22:36 10723做项目过程中遇到一个问题,从数据库里读取图片名称,然后调用图片 ...
相关推荐
Android应用皮肤切换Demo,简要实现皮肤切换的机制
在标准的Windows和Linux桌面操作系统中,同时可以在不同的窗口中运行多个应用程序,每次只有一个应用程序是当前焦点状态,但其他的应用程序都是一个平等的位置。用户可以随时切换每个应用程序,在不需要应用程序时,...
每一个 Android 应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik 虚拟 机实例。Dalvik 被设计 成一个设备可以同时高效地运行多个虚拟系统。 Dalvik 虚拟机执行(.dex)的 Dalvik 可执行文件,该格式文 件...
Android Android Android Android 应用现状 � 设备商: lenovo 、琦基、戴尔、三星、摩托罗拉、华为、英特尔、 Kogan 、索爱、华硕、多普达、爱可 视 、 Archos 等。 � 制造商: HTC 、 Telstra 等。 � 手机设计...
12.3.1 在Android应用中使用 OpenGL ES 454 12.3.2 绘制平面上的多边形 457 12.3.3 旋转 463 12.4 绘制3D图形 465 12.4.1 构建3D图形 465 12.4.2 应用纹理贴图 469 12.5 本章小结 475 第13章 ...
本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层...
6、第一个android应用程序 15 7、Android组件介绍 20 三、Android应用程序架构分析 21 1、Android布局组件介绍及其实例分析 21 2.1 布局组件概述 21 2.1.1 五大布局: 21 2.1.2 属性: 21 2.1.3 常用的长度单位解析...
2.3 运行和调试android应用程序 2.3.1 连接设备 2.3.2 创建一个android虚拟设备 2.3.3 运行应用程序 2.3.4 调试应用程序 2.3.5 logcat和ddms 2.3.6 使用adb 2.4 小结 第3章 游戏开发基础 3.1 游戏...
2.2 Android中的多进程模式 / 36 2.2.1 开启多进程模式 / 36 2.2.2 多进程模式的运行机制 / 39 2.3 IPC基础概念介绍 / 42 2.3.1 Serializable接口 / 42 2.3.2 Parcelable接口 / 45 2.3.3 Binder / 47 ...
该项目包含了多种在Android应用中常用的页面特效,如滑动菜单、下拉刷新、滚动条、页面切换动画等。这些特效不仅提升了应用的视觉效果,还提高了用户体验。 项目源码基于Android Studio编写,结构清晰,注释详细,...
Android中StateMachine机制 对与State改变切换这种常见常用的处理, 只是各个平台框架中处理的方法不同, ...在Android中使用的了StateMachine机制就是一个State模式的应用, StateMachine是非常的强大和精妙。
针对性强,注重实际应用开发需求,书中所涵盖的知识点都是android应用开发者和系统开发者需要重点掌握的。 全书共10章,第1章介绍了阅读本书所需要做的准备工作,主要包括对android系统架构和源码阅读方法的介绍;...
Android项目开发报告 1项目简介 本次中软培训主要是关于android的基本应用开发,培训的任务主要是开发一个与日常生活花费有关的现金日记账软件,由于时间紧张此软件只实现了登录、注册、添加、查询等功能,未涉及...
《Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些...
(1)针对多窗口类浏览器模式问题,指出并分析了该问题存在的原因,利用Activity的运行机制,通过Fragment栈对主要模块的Webview进行管理,实现对不同模块之间切换的控制。 (2)针对跨域数据交互问题,指出并分析了...
1工程简介 本次中软培训主要是关于android的根本应用开发,培训的任务主要是开发一个与日 常生活花费有关的现金日记账软件,由于时间紧此软件只实现了登录、注册、添加、查 询等功能,未涉及细节处理。此次工程开发...
12.3.1 在Android应用中使用 OpenGL ES 454 12.3.2 绘制平面上的多边形 457 12.3.3 旋转 463 12.4 绘制3D图形 465 12.4.1 构建3D图形 465 12.4.2 应用纹理贴图 469 12.5 本章小结 475 第13章 Android的网络应用 476 ...
12.3.1 在Android应用中使用 OpenGL ES 454 12.3.2 绘制平面上的多边形 457 12.3.3 旋转 463 12.4 绘制3D图形 465 12.4.1 构建3D图形 465 12.4.2 应用纹理贴图 469 12.5 本章小结 475 第13章 Android的网络应用 476 ...