日夜间模式的切换

一招切换日/夜间模式:Pixso 2.0变量系统实现主题切换设计实战 如上图对比表所示,相比于传统的手动切换页面风格、修改颜色样式,Pixso变量系统不仅可以快速解决视觉风格切换,还从根本上解决了样式不统一、维护成本高的问题。如果你还没有上手,不妨试着从“日/夜间模式切换”这个场景开始练手,真正感受变量在实战中的作用。 阅读详情

看了网上那么多日夜间模式切换的方法,大概来说就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);
    }
}
Android日夜间模式切换实战项目详解 现代移动应用在不同光照环境下为用户提供舒适的视觉体验已成为标配功能之一。Android系统的日夜间模式切换不仅提升了可读性和护眼效果,也体现了产品对用户个性化需求的深度理解。本章将从人机交互角度剖析日夜间模式的设计初衷,探讨其在提升用户体验、降低视觉疲劳以及增强界面一致性的关键作用。同时,分析主流App中该功能的实际应用场景,揭示自动适配与手动控制之间的平衡设计原则,为后续技术实现奠定理论基础。 阅读详情

相关推荐

用LangFuse+LangChain打造可观测的AI应用:从埋点到成本监控实战

本文详细介绍了如何将开源可观测性平台LangFuse深度集成到基于LangChain构建的AI应用中,特别是电商客服机器人场景。通过从基础SDK集成、提示词管理到成本监控的完整实战,帮助开发者实现对LLM应用内部工作流的清晰追踪、问题排查与费用分析,从而打造稳定、可控的生产级AI应用。

dapp9builder的博客 711

Android最简单实现日夜间模式切换

如果你用的是Android studio开发,则先把Android工程切换为Project,在你的项目下的res目录下创建一个values-night文件夹,并在这个文件夹下创建colors.xml文件,代码如下 <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#303F9F</colo

王志伟的博客 5443

手把手搭建摄像头驱动(一):I2C设备树插件与OV5640实战

本文手把手指导如何搭建OV5640摄像头驱动,重点讲解I2C设备树插件的编写与实战应用。通过硬件连接验证、I2C驱动框架搭建、设备树插件编译及动态加载调试,系统介绍Linux驱动开发全流程,并提供常见问题解决方案,帮助开发者快速掌握摄像头驱动开发技术。

git9versioner的博客 755

35.注册监听器的两种方法(View.OnClickListener)

1. 使用匿名类注册监听器public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV

liuzhiqinag的博客 3547

机器人学习-matlab四足机器人控制仿真

《机器人学,机器视觉与控制》学习笔记 使用工具箱版本9.10 题目与解决思路: 【1】. 通过减少复位期间的抬腿高度来缩短复位的轨迹 Z轴向下,为了减小复位器件的抬腿高度,应当缩小△Z,故可以将示例程序中zu值调大。 【2】. 增加腿的步幅 腿的步幅可由改变x方向上腿前进和后退运动的极限来达到,令xf = 7; xb = -xf;即可。 ...

weixin_44609769的博客 5538

ANSYS CFX 自定义函数数据导入实战指南

本文详细介绍了在ANSYS CFX中实现自定义函数数据导入的完整流程与实战技巧。通过具体案例,指导用户如何将外部实验或计算数据(如材料属性随温度变化)导入CFX,创建可调用的函数,并正确关联到仿真模型中,从而显著提升仿真的真实性与准确性。

v6b7n8m9q0的博客 703

Android 白天黑夜模式切换适配及引起的Activity销毁重启解决

Android 10 暗黑模式适配

凌云志 1万+

Git系列(一)、Git基础教程【建议收藏】

Git一、Git简介1.1、什么是Git? 一、Git简介 1.1、什么是Git? Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式版本库的方式,不用服务器端软件支持。 .........

一宿君 4万+

box-shadow实现外发光效果

box-shadow:-1px 0 20px #3B3B3B(左边), 1px 0 20px #3B3B3B(右边), 0 -1px 20px #3B3B3B(上边), 0 1px 20px #3B3B3B(下边)**用法:** box-shadow: h-shadow v-shadow blur spread color inset; h-shadow:水平阴影位置(允许负值) v-shad

孤独行者 5990

编写一个期货跨期套利的程序,谈谈思路及案例

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1718

Windows 11 安装 OpenClaw(龙虾):不用WSL、不用虚拟机、启动、使用、停止、卸载

本文详解 Windows 11 原生安装 OpenClaw(龙虾)全流程,无需 WSL 或虚拟机。涵盖环境配置、安全警示、模型接入(如通义千问)及技能初始化。提供启动、文件自动化操作、停止与卸载的完整指南,并附常见认证过期解决方案。助您快速部署本地 AI 智能体,实现电脑操作自动化,提升工作效率。

寒水馨 · 轻量级技术文档 · hanshuixin.org 900

日夜间模式切换

切换日夜间模式

Super Monster的博客 1336

华为OD机试 - 去除多余空格(Python/JS/C/C++ 2024 E卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。条件约束:输入为两行字符串:第一行:待去除多余空格的文本,用例保证如果有单引号,则单引号成对出现,且单引号可能有多对。 第二

学Java,找哪吒 1216

android日夜间模式的切换:

大家好 我是 菠萝派 目前我知道的有三种 日夜间模式的切换方式: 1.设置setTheme 主题用来切换 2.设置asl(Android Support Library)中的 UiMode来支持日间/夜间模式的切换 3.通过资源id的映射 回调自定义ThemeChangeListener接口来处理日间页间模式的切换 今天就介绍一下第一种方式: 效果 step1: 在values...

Spider_007 1565

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android实现日夜间模式切换

对于阅读类的App来说,没有夜间模式,

corerzhang的专栏 3187

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

简单实现日夜间模式切换

在values下的color中设置一个颜色 color name="bg_select">#fffcolor>//为日间模式时的颜色 新建一个values-night文件夹将values中的color复制到此文件夹下 color name="bg_select">#000color>//改变夜间模式时需要的颜色 //将夜间模式需要改变颜色的地方背景颜色设置为bg_select

duanzeshan的博客 1444

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android高级日夜切换,Android APP日夜间模式切换

说在前面日夜间模式在app上面的体验不必多说,特别是晚上,所以这玩意儿是个好东西,民间版本的夜间模式实现效果都很友好,但是都很复杂。官方在Android Support Library 23.2开始支持了夜间模式切换,所以大家伙儿不妨试试?上效果实践1.关于gradle依赖就不多说了,新建项目就会依赖compile'com.android.support:appcompat-v7:24.2.1'...

weixin_28993425的博客 1216

探索夜色:Android日夜间模式切换库——NightOwl

探索夜色:Android日夜间模式切换库——NightOwl 在移动应用开发中,提供一个可随环境变化的日夜间主题切换功能已经成为一种趋势。NightOwl是一个实验性的Android项目,专注于帮助开发者轻松实现这一特性。只需几行代码,你的应用就能拥有优雅的日夜切换效果。 项目介绍 NightOwl的核心在于其简洁的API设计和高效的运行机制。它为Android应用程序提供了动态切换日间和夜间模...

gitblog_00063的博客 875

Flutter日夜间模式切换组件推荐

Flutter日夜间模式切换组件推荐 本文将为您介绍一个优秀的开源项目——Flutter日夜间模式切换组件(Day Night Switch)。该项目采用Dart语言开发,适用于Flutter应用程序。 1. 项目基础介绍 项目名称:Day Night Switch 编程语言:Dart 该项目是一个Flutter组件,用于在应用程序中添加一个日夜间模式切换功能。用户可以通过一个简单的切换按钮在日间...

gitblog_00464的博客 516

Android APP日夜间模式切换

说在前面 日夜间模式在app上面的体验不必多说,特别是晚上,所以这玩意儿是个好东西,民间版本的夜间模式实现效果都很友好,但是都很复杂。官方在Android Support Library 23.2开始支持了夜间模式切换,所以大家伙儿不妨试试? 上代码 DayNightDemo 上效果 实践 1.关于gradle依赖就不多说了,新建项目就会依赖 compi

qq_23174861的博客 1600

推荐项目:Skin Sprite - 无缝切换日夜间模式的神器

推荐项目:Skin Sprite - 无缝切换日夜间模式的神器 在Android开发中,实现应用的日间与夜间模式切换,一直是许多开发者追求用户体验的重要功能。今天,我们要推荐的是一个轻量级且高效的解决方案——Skin Sprite,无需重新创建Activity,即可优雅地实现这一转变。 项目介绍 Skin Sprite,一款受appcompat-v7启发的库,专为解决Api 14以上版本的Andr...

gitblog_00152的博客 370

android日夜间模式切换动画

转载请说明出处 在一些应用中需要有日夜间模式,当切换模式之后,如果不给点过渡动画,那效果看起来比较差。 那用什么方式来做这个切换过渡动画呢? 第一种:选择用一个activity来做过渡 首先我们建一个activity import android.os.Bundle; import android.os.Handler; import android.view.View; imp

asd2603934小马哥 2900

android日夜间模式切换

一 日夜间模式方法 public class BaseActivity extends Activity { protected View mCoverView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta

Zby___的博客 474
上一篇: ViewPager引导页实现跟随式小圆点
下一篇: 视频引导页
尘彦
博客等级 码龄11年 92粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘彦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值