日夜间模式的切换

来源:互联网 发布:短信猫 java usb 编辑:程序博客网 时间:2024/05/01 08:03

看了网上那么多日夜间模式切换的方法,大概来说就3种吧!不过最好的一种便是通过反射来实现~
参考链接:http://yuqirong.me/2016/09/08/对于Android日夜间模式实现的探讨/

1:在values文件夹下的colors.xml里添加:

<color name="textColor">#3b3b3b</color><color name="textColor_night">#FFFFFF</color><color name="backgroundColor">#FFFFFF</color><color name="backgroundColor_night">#3b3b3b</color>

2:创建Theme管理类

package com.example.administrator.demo.view;import android.content.Context;import android.content.res.Resources;import java.util.HashMap;import java.util.LinkedList;import java.util.List;public class ThemeManager {    // 默认是日间模式    private static ThemeMode mThemeMode = ThemeMode.DAY;    // 主题模式监听器    private static List<OnThemeChangeListener> mThemeChangeListenerList = new LinkedList<>();    // 夜间资源的缓存,key : 资源类型, 值<key:资源名称, value:int值>    private static HashMap<String, HashMap<String, Integer>> sCachedNightResrouces = new HashMap<>();    // 夜间模式资源的后缀,比如日件模式资源名为:R.color.activity_bg, 那么夜间模式就为 :R.color.activity_bg_night    private static final String RESOURCE_SUFFIX = "_night";    /**     * 主题模式,分为日间模式和夜间模式     */    public enum ThemeMode {        DAY, NIGHT    }    /**     * 设置主题模式     */    public static void setThemeMode(ThemeMode themeMode) {        if (mThemeMode != themeMode) {            mThemeMode = themeMode;            if (mThemeChangeListenerList.size() > 0) {                for (OnThemeChangeListener listener : mThemeChangeListenerList) {                    listener.onThemeChanged();                }            }        }    }    /**     * 根据传入的日间模式的resId得到相应主题的resId,注意:必须是日间模式的resId     * 日间模式的resId     * 相应主题的resId,若为日间模式,则得到dayResId;反之夜间模式得到nightResId     */    public static int getCurrentThemeRes(Context context, int dayResId) {        if (getThemeMode() == ThemeMode.DAY) {            return dayResId;        }        // 资源名        String entryName = context.getResources().getResourceEntryName(dayResId);        // 资源类型        String typeName = context.getResources().getResourceTypeName(dayResId);        HashMap<String, Integer> cachedRes = sCachedNightResrouces.get(typeName);        // 先从缓存中去取,如果有直接返回该id        if (cachedRes == null) {            cachedRes = new HashMap<>();        }        Integer resId = cachedRes.get(entryName + RESOURCE_SUFFIX);        if (resId != null && resId != 0) {            return resId;        } else {            //如果缓存中没有再根据资源id去动态获取            try {                // 通过资源名,资源类型,包名得到资源int值                int nightResId = context.getResources().getIdentifier(entryName + RESOURCE_SUFFIX, typeName, context.getPackageName());                // 放入缓存中                cachedRes.put(entryName + RESOURCE_SUFFIX, nightResId);                sCachedNightResrouces.put(typeName, cachedRes);                return nightResId;            } catch (Resources.NotFoundException e) {                e.printStackTrace();            }        }        return 0;    }    /**     * 注册ThemeChangeListener     */    public static void registerThemeChangeListener(OnThemeChangeListener listener) {        if (!mThemeChangeListenerList.contains(listener)) {            mThemeChangeListenerList.add(listener);        }    }    /**     * 反注册ThemeChangeListener     */    public static void unregisterThemeChangeListener(OnThemeChangeListener listener) {        if (mThemeChangeListenerList.contains(listener)) {            mThemeChangeListenerList.remove(listener);        }    }    /**     * 得到主题模式     */    public static ThemeMode getThemeMode() {        return mThemeMode;    }    /**     * 主题模式切换监听器     */    public interface OnThemeChangeListener {        /**         * 主题切换时回调         */        void onThemeChanged();    }}

3:Activity中使用

package com.example.administrator.demo.activity;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.RelativeLayout;import com.example.administrator.demo.R;import com.example.administrator.demo.view.ThemeManager;public class MainActivity extends Activity implements ThemeManager.OnThemeChangeListener{    private Button day_night_mode;    private RelativeLayout relativeLayout;    private boolean isDay = true;//默认是日间模式    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ThemeManager.registerThemeChangeListener(this);        day_night_mode = (Button) findViewById(R.id.day_night_mode);        relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);        day_night_mode.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if(isDay==true){                    ThemeManager.setThemeMode(ThemeManager.ThemeMode.NIGHT );                    day_night_mode.setText("日间模式");                    isDay=false;                }else {                    ThemeManager.setThemeMode(ThemeManager.ThemeMode.DAY );                    day_night_mode.setText("夜间模式");                    isDay=true;                }            }        });    }    @Override    public void onThemeChanged() {        //日间模式下的颜色        day_night_mode.setTextColor(getResources().getColor(ThemeManager.getCurrentThemeRes(MainActivity.this, R.color.textColor)));        relativeLayout.setBackgroundColor(getResources().getColor(ThemeManager.getCurrentThemeRes(MainActivity.this, R.color.backgroundColor)));    }    @Override    protected void onDestroy() {        super.onDestroy();        ThemeManager.unregisterThemeChangeListener(this);    }}
0 0
原创粉丝点击