日夜间模式的切换
来源:互联网 发布:短信猫 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
- 日夜间模式的切换
- 日夜间模式的切换
- 日夜间模式的切换
- 日夜间模式切换
- 日夜间模式切换
- 日夜间模式切换
- 日夜间模式切换
- 日夜间模式切换
- 日夜间模式切换
- 日夜间模式切换
- 日夜间模式切换
- 日夜间模式切换
- 日夜间模式切换
- 日夜间模式切换
- Android 切换日夜间模式
- 轻松切换日夜间模式
- Android日夜间模式切换
- Android日夜间切换模式
- LOB
- 深度探索c++对象模型之虚继承的对象构造
- 正则表达式
- iOS基于MVC的项目重构总结
- Gradle读书笔记1
- 日夜间模式的切换
- samba配置
- web.xml 中元素加载顺序及其详解
- JSONObject与JSONArray的区别 解析json数据
- 第十章:Approximate Inference exercise 18-24
- 安卓开发之登录接口分析
- ES6学习11(Promise)
- cocoapods使用
- ccf之高速公路 求强连通分量问题