android实现皮肤更换(夜间模式) http://www.eoeandroid.com/thread-297188-1-1.html 开发资源 源码下载 高薪招聘 应用开发 游戏开发 视频教程 博客 淘帖 论坛 › eoe·Android应用开发区 › Android开发进阶&经验分享 28 2267 1 2 / 2 页 下一页 关于android主题运用一点点知识,夜间模式实现 android_hejinxi 于 2013-7-29 10:53 发表在 [Android分享] [复制链接] [只看楼主] [上一主题] [下一主题] 由于公司产品不断有新的需求。其中之一就是要出个夜间模式。其实说到底就是换肤功能。android的换肤知识其实不是很丰富。 说到底其实有三种。这里转载一篇http://blog.csdn.net/suiyc/article/details/6329212其中有一点点介绍知识。大家不妨看看。 而我就选择做最简单直接的。就是直接软件内置多个皮肤,不可由用户增加或修改;。只要让美工多切套夜间模式的图。 当然这里还是要考虑下到时候的资源比较大咯。 其实在我实践过程中。设置主题主要涉及到几个方面,一个是attrs.xml文件。主要是定义我们自己的一些自定义属性。方便我们在styles.xml中引用。 对于attrs.xml文件,大家可能比较陌生。其实也是比较简单。具体请看这里介绍http://www.oschina.net/android/125/ 我把内部给大家看下 大家可以自己定义的属性。 然后在styles.xml文件引用。比如说我设置了两个主题。 一个是正常模式 <style name="mytheme" parent="Theme.Sherlock">,一个是夜间模式 <style name="nightTheme" parent="Theme.Sherlock"> 具体看下两个主题的属性,正常模式 ,夜间模式 然后里面的属性就设置我们一些要设置的资源文件。如background中的值。引用不同的背景图。 如我们在布局文件中可以这样写 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="?backgroud" android:orientation="vertical" > 其中的?backgroud就是我们引用定义主题中的backgroud中的资源。 如果我们正常模式时候。那么我们背景色就是@color/postslist_backgroud,夜间模式就是@drawable/bg 其他设置也是一样。如字体的颜色。按钮背景色等等。都是一样的道理。只要在attrs.xml中定义一个新的标签 下面贴出一个EditView中引用的 <EditText android:id="@+id/et_username" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="?inputEditStyle" android:drawableLeft="@drawable/login_icon1" android:gravity="center_vertical" android:textColor="?postDetailHeadTextFont1" android:textCursorDrawable="@null" android:singleLine="true" android:paddingLeft="5dip" /> 既有背景。又有字体颜色。 当我们要切换主题。其实要先写个主题操作类。储存当前的皮肤模式 代码我就贴下 public class SkinSettingManager { public final static String SKIN_PREF = "skinSetting"; public SharedPreferences skinSettingPreference; private int[] skinResources = {R.style.mytheme,R.style.nightTheme }; private Activity mActivity; public SkinSettingManager(Activity activity) { this.mActivity = activity; skinSettingPreference = mActivity.getSharedPreferences(SKIN_PREF, 3); } /** * 获取当前程序的皮肤序号 * * @return */ public int getSkinType() { String key = "skin_type"; return skinSettingPreference.getInt(key, 0); } /** * 把皮肤序号写到全局设置里去 * * @param j */ public void setSkinType(int j) { SharedPreferences.Editor editor = skinSettingPreference.edit(); String key = "skin_type"; editor.putInt(key, j); editor.commit(); } /** * 获取当前皮肤的背景图资源id * * @return */ public int getCurrentSkinRes() { int skinLen = skinResources.length; int getSkinLen = getSkinType(); if(getSkinLen >= skinLen){ getSkinLen = 0; } return skinResources[getSkinLen]; } /** * 用于导航栏皮肤按钮切换皮肤 */ public int toggleSkins(){ int skinType = getSkinType(); if(skinType == skinResources.length - 1){ skinType = 0; }else{ skinType ++; } setSkinType(skinType); return getCurrentSkinRes(); } } 然后我们自己定义一个BaseActivity继承Activity int themes ; 重写onCreate @Override protected void onCreate(Bundle savedInstanceState) { themes = new SkinSettingManager(this).getCurrentSkinRes(); this.setTheme(themes); super.onCreate(savedInstanceState); } 这样就可以设置了主题模式了