admin 管理员组

文章数量: 1184232

Android实现夜间模式切换功能

项目简介

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


首先,在build.gradle中添加依赖

compile 'com.android.support:appcompat-v7:25.1.0'

调试后进行下一步

在values的styles继承并应用DayNight主题

<resources><!-- Base application theme.--><style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar"><!-- Customize your theme here.--><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style><attr name="mainBackground" format="color|reference"></attr></resources>

在res目录下新建values-night文件夹,在此目录下新建colors.xml和strings.xml文件

values-night文件中的代码是在values文件的基础上修改的,在下方进行对比
values中的colors.xml

<?xml version="1.0" encoding="utf-8"?><!-- day values colors.xml --><resources><color name="colorPrimary">#009688</color><color name="colorPrimaryDark">#00796B</color><color name="colorAccent">#009688</color><color name="textColorPrimary">#616161</color><color name="viewBackground">@android:color/white</color><color name="colorDayNightChange">@android:color/holo_orange_dark</color></resources>

values-night中的colors.xml

<?xml version="1.0" encoding="utf-8"?><!-- night values colors.xml --><resources><color name="colorPrimary">#35464e</color><color name="colorPrimaryDark">#212a2f</color><color name="colorAccent">#212a2f</color><color name="textColorPrimary">#616161</color><color name="viewBackground">#212a2f</color><color name="colorDayNightChange">@android:color/holo_blue_dark</color></resources>

values中的strings.xml

<resources><string name="app_name">DayNight</string><string name="day_night_label">日间模式</string></resources>

values-night中的strings.xml

<resources><string name="app_name">DayNight</string><string name="day_night_label">夜间模式</string></resources>

在MainActivity.java中添加点击、功能动作

publicclassMainActivityextendsAppCompatActivity{private Button mDayNightChange;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
        mDayNightChange =(Button)findViewById(R.id.day_night_change);
        mDayNightChange.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(View v){int mode =getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;if(mode == Configuration.UI_MODE_NIGHT_YES){getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);}elseif(mode == Configuration.UI_MODE_NIGHT_NO){getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);}recreate();}});}}

其中,在添加
import android.support.v7.app.AppCompatActivity;import android.support.v7.app.AppCompatDelegate;

时可能会遇到报红或无法找到的问题,可以用下方的代码替代

import androidx.appcompat.app.AppCompatActivity;import androidx.appcompat.app.AppCompatDelegate;

在多个地方都会遇到

添加MyApplication.java,设置功能类型

import android.app.Application;import androidx.appcompat.app.AppCompatDelegate;publicclassMyApplicationextendsApplication{@OverridepublicvoidonCreate(){super.onCreate();
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);}}

这里的 Mode 有四种类型可以选择:

MODE_NIGHT_NO: 使用亮色(light)主题,不使用夜间模式;
MODE_NIGHT_YES:使用暗色(dark)主题,使用夜间模式;
MODE_NIGHT_AUTO:根据当前时间自动切换 亮色(light)/暗色(dark)主题;
MODE_NIGHT_FOLLOW_SYSTEM(默认选项):设置为跟随系统,通常为 MODE_NIGHT_NO

本文标签: 夜间模式 主题 中的