android夜间模式的实现
项目中要用到夜间模式,今天我就来总结,我是怎么实现的吧
实现原理:我们把当前的主题存放在sp中,每当activity启动之前调用setTheme方法设置相应的主题,setTheme方法一定要在super.onCreate()方法之前执行。
(1)在values文件夹下, 分别写一套夜间模式下的布局(theme_dark.xml)
和白天模式下的布局(theme_light.xml),
theme_dark.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme_Night" >
<item name="username_double">@color/night_gray_1</item>
<item name="gray_1_double">@color/gray_1_night</item>
<item name="gray_3_double">@color/gray_3_night</item>
<item name="source_bg">@drawable/source_bg_night</item>
</style>
</resources>
theme_light.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme_Light" >
<item name="username_double">@color/light_gray_1</item>
<item name="gray_1_double">@color/light_gray_1</item>
<item name="gray_3_double">@color/gray_3</item>
<item name="source_bg">@drawable/source_bg_light</item>
</style>
</resources>
(2) 在values文件下新建一个theme_attrs.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="username_double" format="color" /> <attr name="gray_1_double" format="color" /> <attr name="gray_3_double" format="color" /> <attr name="source_bg" format="reference" /> </resources>
前面3个是颜色属性,后面是一个drawable类型,分别和 theme_light.xml和theme_night一一对应。当然还可以是状态选择器,shape图形资源。
(3) 在activity中我们要在super.onCreate()方法之前调用setTheme()方法,由于项目中的每个activity都要调用该方法,所以我把这个方法放在BaseActivity中实现。
public class BaseActivity extends Activity {
protected int skin;
public Context mContext;
SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
setThemeMode(getSkinTypeValue());
super.onCreate(savedInstanceState);
Global.mContext = this;
this.mContext = this;
sp = getSharedPreferences("AppSkinType", Context.MODE_PRIVATE);
}
protected void setThemeMode(SkinType skinType) {
switch (skinType) {
case Light:
setTheme(R.style.AppTheme_Light);
break;
case Night:
setTheme(R.style.AppTheme_Night);
break;
default:
setTheme(R.style.AppTheme_Light);
break;
}
}
protected SkinType getSkinTypeValue() {
if (sp == null) {
sp = getSharedPreferences("AppSkinType", Context.MODE_PRIVATE);
}
int i = sp.getInt("AppSkinType", 0);
switch (i) {
case 0:
return SkinType.Light;
case 1:
return SkinType.Night;
default:
break;
}
return SkinType.Light;
}
protected void saveSkinValue(int skin) {
if (sp == null) {
sp = getSharedPreferences("AppSkinType", Context.MODE_PRIVATE);
}
Editor editor = sp.edit();
editor.putInt("AppSkinTypeValue", skin);
editor.commit();
}
}
(4)下面是我写的一个列子,布局很简单,就是一个textView和chebox,checkBox选中的时候便设置成夜间模式,没有选中便为白天模式
代码如下:
package com.example.activity;
import com.example.night_mode.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
public class MainActivity extends BaseActivity {
private CheckBox cbSetting;
private String Tag = "mainActivity";
private Button btnForward;
private View llNight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
llNight = findViewById(R.id.ll_night);
btnForward = (Button) findViewById(R.id.forward);
cbSetting = (CheckBox) findViewById(R.id.cb_setting);
cbSetting.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (cbSetting.isChecked()) {
// 设置夜间模式
saveSkinValue(1);
llNight.setBackgroundDrawable(getResources().getDrawable(R.drawable.source_bg_night));
} else {
// 设置白天模式
saveSkinValue(0);
llNight.setBackgroundDrawable(getResources().getDrawable(R.drawable.source_bg_light));
}
}
});
btnForward.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
SecondActivity.class);
startActivity(intent);
}
});
}
}
代码已贴出
相关推荐
在Android应用开发中,夜间模式是一项重要的功能,它允许用户在低光照环境下或者根据个人喜好调整应用程序的...总之,实现Android夜间模式是一个涉及多方面技术的综合过程,包括UI设计、系统API调用和跨语言交互等。
本篇文章将详细解释如何通过在窗口上添加一层半透明的View来实现Android的夜间模式。 首先,我们要理解Android窗口(Window)的概念。在Android中,每个Activity都与一个Window对应,它是一个抽象层,负责处理显示...
本文将详细讲解如何通过原生方式在Android应用中实现夜间模式。 首先,我们需要理解Android中的资源多态性。Android系统支持根据不同的配置(如语言、屏幕尺寸等)加载相应的资源。我们可以利用这一特性来实现夜间...
以上就是通过在window上加一层半透明的View来实现Android夜间模式的基本思路。实际开发中,开发者还可以结合SharedPreferences存储用户的夜间模式偏好,以及使用Android的AppCompat库的DarkTheme主题来全局实现夜间...
这个"Android夜间模式demo"提供了实现这一功能的实例代码,帮助开发者理解如何在应用程序中添加夜间模式并保存用户的设置。 1. **夜间模式的实现原理** - Android夜间模式主要通过改变界面的主题和颜色来实现。...
5. **监听系统夜间模式变化**:为了实现动态响应系统夜间模式的切换,开发者通常需要注册一个广播接收器或使用AndroidX的Lifecycle组件来监听系统设置的变化。 6. **第三方库的使用**:如achenglike-NightModel-84...
"Android夜间模式动态切换"这个话题主要关注如何在应用程序中实现实时改变界面颜色方案,以便用户可以在明亮环境下舒适地使用(日间模式)或者在暗环境中减少眼睛疲劳(夜间模式)。Android官方从Support Library ...
这个“android夜间模式核心demo”是针对这一功能的具体实现示例,旨在帮助开发者理解和掌握如何在自己的应用中添加夜间模式。下面将详细介绍这个demo的关键知识点。 1. 自定义主题:夜间模式的核心在于切换不同的...
总结来说,实现Android夜间模式切换并加入颜色渐变效果主要涉及以下几个步骤: 1. 创建日间和夜间主题的XML文件。 2. 在`AndroidManifest.xml`中设置默认主题。 3. 在`Application`或`Activity`中处理主题切换逻辑...
在Android系统中,实现日夜间模式主要有以下几种方式: 1. **SharedPreferences**:通过存储用户的主题选择(日间/夜间),在启动应用时读取这些设置,并据此调整UI样式。这通常涉及到在不同主题模式下加载不同的...
在安卓平台上,夜间模式是一种非常重要的用户体验特性,它允许...以上就是“ChangeModeDemo”项目中可能涉及的Android夜间模式实现的关键技术点。通过理解这些概念,开发者可以创建一个能够提供优质夜间体验的应用。
ThemeDemo日夜间模式切换,页面切换的时候附带动画特效, 关于多主题实现的,大牛这里的做法是继承AppCompatActivity,置换了AppCompatDelegate中AppCompatViewInflater中的createView 方法.实现了对 xml 控件的控制. ...
本篇将详细介绍如何利用CSS注入来实现在Android Webview中切换到夜间模式。 首先,我们需要理解CSS注入的概念。CSS(Cascading Style Sheets)是用于描述HTML或XML(包括如SVG、MathML等各种XML方言)文档样式的...
夜间模式实现 所谓的夜间模式,就是能够根据不同的设定,呈现不同风格的界面给用户,而且晚上看着不伤眼睛,实现方式也就是所谓的换肤(主题切换)。对于夜间模式的实现网上流传了很多种方式。也反编译了几个新闻类...
`Zdndemo`可能是提供了一个关于夜间模式实现的示例项目。在该项目中,你可能可以找到以下内容: 1. **资源文件夹**:可能包含`values`和`values-night`两个资源文件夹,分别用于日间和夜间模式。 2. **主题配置**:`...
实现了日夜模式的切换.(不重启 Acitivity ) 解决了因为快速点击 View 导致的多次响应点击事件. 内部实现了 Android 5.0 的CircularReveal效果. 优点: 布局中直接使用 Android 默认的控件就可以.在解析以后会根据...
在Android应用开发中,实现夜间模式是提升用户体验的重要一环。夜间模式可以帮助用户在低光环境下减少屏幕亮度,减轻眼睛疲劳。本篇文章将详细介绍如何通过修改Android应用的Theme来实现夜间模式。 首先,理解...
Android系统允许开发者通过切换不同的主题资源来实现夜间模式。这通常涉及到在`res/values`目录下创建不同的颜色、样式和布局文件,如`colors_night.xml`, `styles_night.xml`等,分别对应夜间模式的资源。在切换到...
本教程将详细讲解如何在Android的WebView中实现夜间模式。 首先,我们需要创建一个可以切换主题颜色的机制。在Android中,我们可以通过自定义主题或者使用Material Design的`Theme.MaterialComponents`来实现。在`...