`
砺雪凝霜
  • 浏览: 156741 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android夜间模式的实现

阅读更多

                                       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);
			}
		});
	}
	
}

 

   代码已贴出

 

 

 

2
1
分享到:
评论

相关推荐

    Android夜间模式实现

    在Android应用开发中,夜间模式是一项重要的功能,它允许用户在低光照环境下或者根据个人喜好调整应用程序的...总之,实现Android夜间模式是一个涉及多方面技术的综合过程,包括UI设计、系统API调用和跨语言交互等。

    Android夜间模式实现,通过在window上加一层半透明的View

    本篇文章将详细解释如何通过在窗口上添加一层半透明的View来实现Android的夜间模式。 首先,我们要理解Android窗口(Window)的概念。在Android中,每个Activity都与一个Window对应,它是一个抽象层,负责处理显示...

    Android原生方式实现夜间模式

    本文将详细讲解如何通过原生方式在Android应用中实现夜间模式。 首先,我们需要理解Android中的资源多态性。Android系统支持根据不同的配置(如语言、屏幕尺寸等)加载相应的资源。我们可以利用这一特性来实现夜间...

    安卓换肤主题更换夜间模式相关-Android夜间模式实现通过在window上加一层半透明的View.rar

    以上就是通过在window上加一层半透明的View来实现Android夜间模式的基本思路。实际开发中,开发者还可以结合SharedPreferences存储用户的夜间模式偏好,以及使用Android的AppCompat库的DarkTheme主题来全局实现夜间...

    Android 夜间模式demo

    这个"Android夜间模式demo"提供了实现这一功能的实例代码,帮助开发者理解如何在应用程序中添加夜间模式并保存用户的设置。 1. **夜间模式的实现原理** - Android夜间模式主要通过改变界面的主题和颜色来实现。...

    Android-这是个方便切换夜间模式的库利用官方夜间模式同时不用重启Activity

    5. **监听系统夜间模式变化**:为了实现动态响应系统夜间模式的切换,开发者通常需要注册一个广播接收器或使用AndroidX的Lifecycle组件来监听系统设置的变化。 6. **第三方库的使用**:如achenglike-NightModel-84...

    Android夜间模式动态切换

    "Android夜间模式动态切换"这个话题主要关注如何在应用程序中实现实时改变界面颜色方案,以便用户可以在明亮环境下舒适地使用(日间模式)或者在暗环境中减少眼睛疲劳(夜间模式)。Android官方从Support Library ...

    android夜间模式核心demo

    这个“android夜间模式核心demo”是针对这一功能的具体实现示例,旨在帮助开发者理解和掌握如何在自己的应用中添加夜间模式。下面将详细介绍这个demo的关键知识点。 1. 自定义主题:夜间模式的核心在于切换不同的...

    android 夜间模式切换,颜色渐变效果实现

    总结来说,实现Android夜间模式切换并加入颜色渐变效果主要涉及以下几个步骤: 1. 创建日间和夜间主题的XML文件。 2. 在`AndroidManifest.xml`中设置默认主题。 3. 在`Application`或`Activity`中处理主题切换逻辑...

    Android-Android日夜间模式切换

    在Android系统中,实现日夜间模式主要有以下几种方式: 1. **SharedPreferences**:通过存储用户的主题选择(日间/夜间),在启动应用时读取这些设置,并据此调整UI样式。这通常涉及到在不同主题模式下加载不同的...

    安卓Android源码——夜间模式示例.zip

    在安卓平台上,夜间模式是一种非常重要的用户体验特性,它允许...以上就是“ChangeModeDemo”项目中可能涉及的Android夜间模式实现的关键技术点。通过理解这些概念,开发者可以创建一个能够提供优质夜间体验的应用。

    Android 日间/夜间模式 主题切换

    ThemeDemo日夜间模式切换,页面切换的时候附带动画特效, 关于多主题实现的,大牛这里的做法是继承AppCompatActivity,置换了AppCompatDelegate中AppCompatViewInflater中的createView 方法.实现了对 xml 控件的控制. ...

    通过css注入实现android webview的夜间模式

    本篇将详细介绍如何利用CSS注入来实现在Android Webview中切换到夜间模式。 首先,我们需要理解CSS注入的概念。CSS(Cascading Style Sheets)是用于描述HTML或XML(包括如SVG、MathML等各种XML方言)文档样式的...

    Android 夜间模式的实现代码示例

    夜间模式实现 所谓的夜间模式,就是能够根据不同的设定,呈现不同风格的界面给用户,而且晚上看着不伤眼睛,实现方式也就是所谓的换肤(主题切换)。对于夜间模式的实现网上流传了很多种方式。也反编译了几个新闻类...

    android 夜间模式

    `Zdndemo`可能是提供了一个关于夜间模式实现的示例项目。在该项目中,你可能可以找到以下内容: 1. **资源文件夹**:可能包含`values`和`values-night`两个资源文件夹,分别用于日间和夜间模式。 2. **主题配置**:`...

    Android代码-不重启实现日夜间模式切换

    实现了日夜模式的切换.(不重启 Acitivity ) 解决了因为快速点击 View 导致的多次响应点击事件. 内部实现了 Android 5.0 的CircularReveal效果. 优点: 布局中直接使用 Android 默认的控件就可以.在解析以后会根据...

    Android改Theme实现夜间模式

    在Android应用开发中,实现夜间模式是提升用户体验的重要一环。夜间模式可以帮助用户在低光环境下减少屏幕亮度,减轻眼睛疲劳。本篇文章将详细介绍如何通过修改Android应用的Theme来实现夜间模式。 首先,理解...

    夜间模式 切换 渐变 Demo 两种方式

    Android系统允许开发者通过切换不同的主题资源来实现夜间模式。这通常涉及到在`res/values`目录下创建不同的颜色、样式和布局文件,如`colors_night.xml`, `styles_night.xml`等,分别对应夜间模式的资源。在切换到...

    Android WebView添加夜间模式

    本教程将详细讲解如何在Android的WebView中实现夜间模式。 首先,我们需要创建一个可以切换主题颜色的机制。在Android中,我们可以通过自定义主题或者使用Material Design的`Theme.MaterialComponents`来实现。在`...

Global site tag (gtag.js) - Google Analytics