http://www.eoeandroid.com/thread-297188-1-1.html

本文介绍了如何在Android应用中实现夜间模式皮肤更换功能,包括使用attrs.xml和styles.xml文件定义自定义属性和主题,以及通过SkinSettingManager类管理当前使用的皮肤类型。详细解释了如何在布局文件中引用主题,并提供了代码示例。
摘要由CSDN通过智能技术生成

android实现皮肤更换(夜间模式)


http://www.eoeandroid.com/thread-297188-1-1.html


由于公司产品不断有新的需求。其中之一就是要出个夜间模式。其实说到底就是换肤功能。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);
        
        }
这样就可以设置了主题模式了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值