android 夜间模式设置

Android设置夜间模式的主题样式 阅读详情

夜晚的故事(android夜间模式实现)

字数2003  阅读1393  评论11 

夜幕降临,他走在马路上,回想着今天发生的一切,他不敢相信事情就这样发生了。他最终还是决定拨打那个电话,掏出手机,解锁屏幕,突然一道强光从屏幕里毫无预兆的发射出来。他一个踉跄倒在了马路中央。而他身后伴随着的是一阵刺耳的刹车声。

手机被摔在一边,屏幕停留在拨号页面,白茫茫的页面。很显然,所谓的强光就是亮白的页面,这种页面在大晚上被打开,眼睛会很不适应,所以
.
.
.
.
.
.
我们来探讨一下夜间模式。

问: android夜间模式的实现有几种?

答: 有好多种。(:◎)≡

  • apk文件

    首先我想到的是,通过下载额外的apk文件,然后在获取该apk文件中的资源文件,然后替换之。当然这种方式就不仅限于夜间模式了,可以有各种模式,也就是更换主题了。采用这种方式的,我猜有,微博和QQ。(:◎)≡

    想要了解,可以参考http://www.eoeandroid.com/thread-102060-1-1.html

  • 自定义View

    把所有用到的view全部自定义一套,根据color和drawable命名规范,比如加_night后缀。根据当前设置的日夜间模式,在onDraw之前获取对应的color或者drawable,然后再进行绘制。采用这种方式的,我猜有,网易新闻。(:)≡

  • setTheme设置style

    这种方式,也是我在之前项目中采取的方式。可以感受一下。
    采用这种方式,你需要这样
    (colors.xml)

    <color name="color_a">#ffffff</color>
    <color name="color_a_night">#000000</color>

    然后这样
    (attrs.xml)

    <attr name="colorA" format="color"/>

    再这样
    (styles.xml)

    <style name="Theme.A">
       <item name="colorA">@color/color_a</item>
    </style>
    <style name="Theme.A.Night">
       <item name="colorA">@color/color_a_night</item>
    </style>

    这样
    (activity_xxx.xml)

    <View 
          android:id="@+id/xxx"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:background="?attr/colorA"/>

    如果此处你设置的background是一个drawable文件,你需要创建两个drawable文件(一个日间文件,一个带_night的夜间文件)。如果你>的这个drawable文件是个<selector> </selector>,不好意思,根据其中<item> </item>的种类数量,你的每种<item> </item>需要再double一份。

    最后再这样
    (xxxActivity.java)

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      ...
      if(!isNightMode()) { 
          setTheme(R.style.Theme_A); 
      } else {
          setTheme(R.style.Theme_A_Night); 
      }
      setContentView(R.layout.activity_xxx);
      ...
    }

    如果需要切换日夜间,先保存切换的模式,然后通过recreate()重启activity

    如果需要在代码中去进行颜色设置,你可以这样

       int[] attrs = { R.attr.colorA };
       TypedArray ta = context.getTheme().obtainStyledAttributes(attrs);
       int color = ta.getColor(ArrayUtils.indexOf(attrs, R.attr.colorA), 0);
       ta.recycle();
       textView.setTextColor(color);

    基本的流程就是这样。不管你受没受够,反正我受够了。我就感觉自己挖了一个坑,当color和drawable越来越多,我就越陷越深,这是什么样的一种感受,没错,就是绝望。

  • NightModeHelper

    这种方式离我即将要说的方式越来越近了,你仅需要在res目录下,再创建一个带-night后缀的values文件夹values-night,再创建一个colors.xml文件,然后创建颜色<colorname="color_a">#000000</color>,注意,这里颜色命名不用添加_night后缀,与values文件夹中的颜色命名相同即可,只是这里的色值需要更换成夜间的。
    然后在xxxActivity.java中

    private NightModeHelper mNightModeHelper;
    
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      ...
      mNightModeHelper = new NightModeHelper(this, R.style.Theme_A);
      setContentView(R.layout.activity_xxx);
      ...
    }
    
    ...
    //需要切换的地方调用该方法
    mNightModeHelper.toggle();
    ...

    NightModeHelper在这里https://gist.github.com/slightfoot/c508cdc8828a478572e0

    这样就成功了,节省了很多繁冗的步骤。曾经我一度以为这是我最后的救命稻草,直到我遇到了她。。。

  • AppCompatDelegate

  • AppCompatDelegate

  • AppCompatDelegate

    重要的事情说三遍!恩,就是这个家伙,不知道什么时候(我是使用的是v23.2.0 Support包),这个家伙里面有了一个这个方法setDefaultNightMode(xxx)。这个方法可以设置四个值:

    • MODE_NIGHT_NO 日间模式
    • MODE_NIGHT_YES 夜间模式
    • MODE_NIGHT_AUTO 根据时间自动切换日夜间模式
    • MODE_NIGHT_FOLLOW_SYSTEM 默认模式,就是跟随系统的设置,据说有可能以后会在android系统设置中添加日夜间模式的设置,此时如果你的app是默认模式,会根据系统设置变化日夜间模式
    怎么用这个方法呢?

    只要你的activity继承AppCompatActivity,app的sdk最低版本在14以上,你在任何地方都可以调用AppCompatDelegate.setDefaultNightMode(xxx),因为这是个静态方法,设置完之后新开启的页面,都会采用新的模式。你需要在每次切换模式之后,把当前模式保存在本地,然后在下次打开app的时候,获取当前模式并调用这个方法设置一下,就可以使app保持之前的模式。

    接下来怎么去自定义自己的日夜间模式呢?

    方法与之前的NightModeHelper类似,创建带-night后缀的文件夹(比如:values-night),然后添加你的资源文件,资源文件需要相同的命名(比如:colors.xml),这样就把夜间资源和日间资源关联起来了。这里注意一下,如果是drawable-xxhdpi中的资源需要夜间模式,这些夜间的资源就应该放在drawable-night-xxhdpi文件夹中。这里其实灵活性很大的,比如你可以在values-night中创建一个strings.xml,实现日夜间显示不同的文本。甚至你可以在layout-night中创建一个同样名字的布局文件,实现日夜间显示不同的布局。

    官方为了方便开发者,在最新的v23.2.0 Support包增加了一个Theme.AppCompat.DayNight主题,如果继承这个主题,会有一些配置好的属性,如果你喜欢官方的配色,可以考虑继承这个主题,也会省下不少功夫。

    还有什么?

    还有个方法也提一下,就是setLocalNightMode(xxx),同样可以设置上述提到的四个值。但是这个方法只能通过getDelegate().setLocalNightMode(xxx)调用,这个方法只对当前activity有效果,并且设置完之后需要recreate()才能使其生效。

    完了没?

    还没完,夜间模式还有个让人头疼的问题就是,当前页面和已经开启的页面的实时更新。之前说的这么多夜间模式方案,都是让之后新的页面获取新的资源,而旧的页面怎么办?

    • 如果你的页面不是很复杂,那就把所有的View再重新设置一遍颜色或者图片。可以直接setTextColor(R.color.xxx) setBackground(R.drawable.xxx)。也可以自定View,重新获取一下资源文件再设置一下。这里还有个前提是,需要更新的activity都得调用getDelegate().setLocalNightMode(xxx)而不是AppCompatDelegate.setDefaultNightMode(xxx),因为后者只是更改了一个全局变量,所以并不会使资源文件立即变化。

    • 如果你的页面很复杂,那就
      .
      .
      .
      .
      .
      .
      recreate()吧!(:◎)≡(如果你有好的方案,也特别希望你能告知我一下!)

他没办法起身,强忍着疼痛,挪动这身体,缓缓的拿起手机。从车上走出来的司机,就在一旁目睹这一切,心想,这年头碰瓷越来越有水平了。颤巍巍的双手触摸着手机屏幕,他最终还是拨打了那个号码,110。司机越来越看不明白,只感觉这套路很深
.
.
.
.
.
.
“喂!是110吗?我钥匙丢家里了,你能找人帮忙开一下吗?”

(最后很感谢这篇分享AppCompat v23.2 — DayNight)

13、Android应用:偏好设置、主题切换与夜间模式支持 本文详细介绍了如何在 Android 应用中实现偏好设置、主题切换以及夜间模式的支持。通过使用 PreferenceFragmentCompat 和 SharedPreferences 管理用户设置,结合 Material Design Components 实现多样化的主题与夜间模式,并提供了常见问题的解决方案及优化建议,帮助开发者提升应用的用户体验。 阅读详情

相关推荐

安卓TXT文本阅读器开发与功能详解

在移动阅读日益普及的今天,安卓TXT阅读器作为一款专注于纯文本阅读的工具,旨在为用户提供简洁、高效、舒适的阅读体验。其核心功能围绕本地与网络文本文件的加载、解析与展示展开,满足用户在碎片化时间中阅读电子书、技术文档、小说等纯文本内容的需求。通过合理设计界面交互与数据处理流程,该阅读器不仅提升了阅读效率,还支持个性化设置,如字体调整、夜间模式、书签记录等实用功能,极大增强了用户粘性与使用便捷性。本章将从功能定位、用户场景与市场需求三个维度,系统性地阐述该阅读器的设计初衷与整体架构思路。

weixin_42146230的博客 964

Android实现夜间模式切换功能

Android实现夜间模式切换功能 项目简介 许多APP现在已经有夜间模式(也有的叫做护眼模式),它可以一键将应用从浅背景色、深前景色切换到深背景色、浅前景色的模式,不仅夜间护眼,还有省电的功效。但以往这些只是APP自己开发的功能,而从 Android Q 开始,夜间模式成为一个全局设置,用户只需下滑呼出快捷设置菜单,开启夜间模式,整个 Android 操作系统界面和支持夜间模式的APP都会自动变成统一的深色风格。对于开发者来说,只需要为应用添加夜间主题就可以自动适应全局夜间模式。 首先,在buil

lkj625的博客 1628

leetcode黑暗模式-Leetcode-Visualizer:以漂亮的方式查看您的Leetcode进度!

leetcode 黑暗模式力码可视化工具 特征 亮/暗模式 难度明智的情节(简单,中等,困难) 类别明智的图(阵列,回溯等...) 完全存在于用户的浏览器中这也意味着,任何人都不会收集任何数据。 计划功能 删除复制粘贴过程 分析提交 将其转换为跨浏览器扩展(以上两个的解决方案) 用法 转到页面。 按照那里的说明进行操作。 技术细节 ReactJS 材质界面 重新图表 本地开发 运行以下命令来设置环境并安装依赖项。 git clone https://github.com/CITIZENDOT/Leetcode-Visualizer.git cd Leetcode-Visualizer yarn install 启动开发服务器。 yarn start 在做 PR 之前,如果你想贡献,请创建一个新分支。 创建一个拉取请求到分支。 贡献 和往常一样,我承诺先批准 Pull Request,然后再审核。 :winking_face:

关于app夜间模式最好实现方式的探讨(二)

haogangshang的专栏 694

Cadence Sigrity PowerSI实战:从.brd到S参数提取的完整避坑指南

本文详细介绍了使用Cadence Sigrity PowerSI进行信号完整性分析的完整流程,从.brd文件预处理到S参数提取的关键技巧。通过实战案例和避坑指南,帮助工程师高效解决高速PCB设计中的信号质量问题,提升仿真精度和设计效率。

carrot的博客 694

MiFlash Prime免授权刷机实战:解锁小米9008 EDL救砖新方案

MiFlash Prime作为免授权刷机工具,有效解决了小米设备在9008 EDL模式下因账号验证无法救砖的难题。本文详细介绍了从驱动安装、进入EDL模式到固件刷写的完整流程,帮助用户安全快速地恢复变砖设备,是维修人员和极客的实用解决方案。

5f4d3s2a1q的博客 2852

Android夜间模式最佳实践

转自:Android夜间模式最佳实践由于Android的设置中并没有夜间模式的选项,对于喜欢睡前玩手机的用户,只能简单的调节手机屏幕亮度来改善体验。目前越来越多的应用开始把夜间模式加到自家应用中,没准不久google也会把这项功能添加到Android系统中吧。业内关于夜间模式的实现,有两种主流方案,各有其利弊,我较为推崇第三种方案: 1、通过切换theme来实现夜间模式。 2、通过资源id映射的

4483

Windows11安装Ubuntu 20.04.3 LTS双系统(详细过程)

一、基础环境 听说BIOS模式的传统MBR模式和新式UEFI模式,会对安装双系统产生影响。Windows11应该都是UEFI吧,可以按win+r输入msinfo32回车确认查看BIOS模式,我的电脑是UEFI+双硬盘 Ubuntu安装准备 1、 官网下载Ubuntu 20.04.3 LTS镜像iso文件:https://ubuntu.com/download/desktop 2、 下载官网推荐的U盘启动制作工具rufus: https://rufus.ie/ 3、制作启动u盘 插入U盘, 运行 rufu

学习随笔 9万+

Android夜间模式的实现方案

对于一款阅读类的软件,夜间模式是不可缺少的。最初看到这个需求时候觉得无从下手,没有一点头绪。后来通过查阅资料发现Android官方在Support Library 23.2.0中已经加入了夜间主题。也就是只需要通过更换主题便可实现夜间模式的切换。下面截取项目实现的夜间模式效果图: 效果看起来非常nice,没有闪屏效果,过度看起来也比较平滑。那么如何实现夜间模式呢?下面将从以下几个方面来实现夜间

smily的博客 2万+

【Clickhouse】Clickhouse写入报错keeper server rejected the connection during the handshake

我的clickhouse集群时不时的报这个错误All connection tries failed while connecting to ZooKeeper. nodes: xxx 到时写入数据失败 用的ck自带的keeper。你需要仔细检查ZooKeeper集群的配置和状态,确保所有节点都正常运行,并且能够正确地选举领导者。检查ZooKeeper的ACL以及ClickHouse连接所使用的凭据,确保它们被正确配置和授权。版本不兼容:有时,不同版本的软件之间可能存在不兼容性,导致连接问题。

九师兄 370

2025.05.29【Network】多组学分析:网络互作图绘制

本文介绍了使用R语言进行网络图绘制的方法与技巧。重点讲解了三个核心R包的使用:igraph用于网络图数据准备与基础绘制,ggraph基于图形语法实现高级可视化,networkD3则为网络图添加交互功能。文章涵盖了从基本概念、包安装、创建网络图对象,到自定义样式布局、添加交互性等完整流程,并提供了度分布、聚类系数等网络分析指标的计算方法。通过清晰的代码示例,帮助读者掌握生物信息学数据可视化的关键技能,为复杂数据的直观展示和分析提供实用工具。

227

Android Q深色模式及源码解析

一、简介 鉴于Android Q 适配如火如荼的情况,我们今天也来讲讲Android Q全新的深色主题背景。不过该项功能,魅族已经推出两年多了,只不过名字我们叫夜间模式,也可见Google有点反借鉴国内厂商的意思。附上两张效果图: 闲话到此为止,我们还是来说说Android Q深色模式的适配方式跟实现原理吧。 二、如何开启 从文档上我们可以可知,打开深色模式有三个方法: 设置 -> 显...

Android 开发架构 2262

UG NX二次开发-博客文章速览

写了一些UG NX二次开发的心得体会,内容较多,感觉不好查找相应的内容,所以决心把导航写出来,方便自己也方便读者。主专栏是“”,C#专栏为 : “” ,Python专栏为 : “这三个专栏都会持续的更新。如果有需要咨询或者学习讨论的,请私信博主或者加QQ群:749492565。博主几乎每天都在。

GimiGimmy 3711

苹果手机夜间模式怎么设置_微信夜间模式终于来了,苹果和安卓都适用!

微信每次版本更新,大家都特别希望增加这些功能。比如:修改微信号、查看访客记录、增加表情包收藏上限、双向删除好友、夜间模式等等。关于查看访客记录、删除好友这两点,虽然微信没有直接出这样的功能,不过大梦想之前分享过可以看到朋友圈的访客、检测好友是否删除的方法。附传送门????????????点我查看朋友圈放个记录点我检测好友是否被删除「夜间模式」这个功能确实是强需,大家睡前都有聊微信、刷朋友圈、看公众号的习惯...

weixin_39980893的博客 787

基于Simulink的四足机器人楼梯攀爬仿真模型

构建一个基于Simulink的四足机器人楼梯攀爬仿真模型,旨在模拟四足机器人在面对楼梯等障碍时的运动控制和稳定性调整。以下是一个详细的步骤指南,帮助你从零开始创建这样一个仿真模型。

xiaoheshang_123的博客 246

23、关联挖掘到相关性分析及约束关联挖掘详解

本文详细解析了从关联挖掘到相关性分析的发展过程,以及基于约束的关联挖掘方法。文章介绍了传统支持-置信度框架的局限性,并引入Lift、χ2、All Confidence和Cosine等度量来评估规则的相关性。同时探讨了多种规则约束在数据挖掘中的应用机制及其优化效果,旨在提高挖掘效率和规则质量。最后结合实际案例说明如何综合运用相关性度量与规则约束以满足业务需求,并展望了数据挖掘技术的未来发展。

aa123的博客 102

苹果手机夜间模式怎么设置_微信终于有“夜间模式”了,苹果安卓都支持!

大家好,我是兔兔(ฅ´ω`ฅ)一个热衷于宠粉跟胡萝卜的小编每天晚上睡觉前,兔兔最喜欢躲在被窝里面刷朋友圈了,但是有件事非常苦恼,当你把灯都关了的时候,手机屏幕那个强光真是可以亮瞎兔兔的双眼,微信没有夜间模式实在是太苦逼了。所以今天兔兔要分享给大家一个新技能,打开手机系统隐藏的夜间模式,不仅可以省点还可以保护自己的小眼睛,而且是安卓和苹果都支持的哟,让你在黑暗里都能愉快的刷微信 安卓“夜...

weixin_39917437的博客 427

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android设置夜间模式切换,android主题切换(简单的白/夜间模式的切换)

效果图:实现:android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="10dp">android:layout_width="match_parent"android:layout_height="40dp"a...

weixin_34668160的博客 613

Statistics and Machine Learning Toolbox

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android设置页面开发终极指南:DataStore数据持久化和夜间模式实现

想要为你的Android应用打造专业级的设置页面吗?😊 本指南将带你从零开始,使用最新的DataStore技术实现数据持久化,并集成智能的夜间模式功能。无论你是Android开发新手还是想要提升技能的开发者,这篇完整的教程都能帮助你快速掌握设置页面开发的核心技巧。 ## 🎯 为什么选择DataStore替代SharedPreferences? DataStore是Google推出的新一代数

gitblog_00472的博客 494

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android ios 夜间模式切换,iOS-夜间模式(换肤设置)

iOS 开发中有时候会有夜间模式(换肤设置)的需求, 其实主要是更改相关颜色操作!思路:每次切换夜间/白天模式时,都会发出通知给所有ViewController,让它们切换到相应的主题。创建一个管理模式主题的单例管理类ThemeManage封装好需要做夜间模式变色处理的控件扩展:UIView (ThemeChange), UINavigationBar (ThemeChange), UITabB...

weixin_30670745的博客 167

Android 夜间模式的设置以及需要注意的地方

在Android Support Library 23.2中更新了很多东西,其中包括AppCompat夜间白天主题。要加入夜间主题也并不难。 在styles.xml里,主题继承Theme.AppCompat.DayNight.NoActionBar <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar"> <!

反魂蝶五分的博客 2163

抖音夜间模式怎么开启android,抖音怎么设置夜间模式

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。以抖音version 12.5.0为例,抖音没有夜间模式,只有通过手机自身的夜间模式进行调节。抖音是一款音乐创意短视频社交软件,是一个专注年轻人的15秒音乐短视频社区。用户可以通过这款软件选择歌曲,拍摄15秒的音乐短视频,形成自己的作品。此App已在Android各大应用商店和APP Store均有上线。抖音于2016年9月上线。...

weixin_42590539的博客 604

Android夜间模式主题设置

本来是想仿照QQ的夜间模式主题做,但因项目紧急,和我目前的水平短时间内做不出来,所以就有了一下的成果,缺点就是每次主题切换的时候因为要重启Activity所以会闪屏。 首先如果你的项目的value中要有这两个文件 attrs.xml和style.xml,如果没有就自己创建一个。 在...

277

安卓设置夜间模式和正常模式

修改theme: name="DayTheme" parent="Theme.AppCompat.Light.DarkActionBar"> name="colorPrimary">@color/colorPrimary name="colorPrimaryDark">@color/colorPrimaryDark name="colorAccent">@c

大城小小爱的博客 1385
上一篇: 常用链接
下一篇: 一个自定义dialog提供确定和取消按钮的回调接口
rongbinjava
博客等级 码龄11年 15粉丝 83原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值