一、概述

android夜间模式实现分为两大类

  • 重启activity的实现
  • 不重启activity的实现

二、正文

1、重启activity实现夜间模式【在界面文件中的实现部分】

1.1在attrs.xml文件中定义如下属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--Activity-->
<attr name="rootViewBgColor" format="reference|color"/>
<attr name="buttonBgColor" format="reference|color"/>
<attr name="defaultTextColor" format="reference|color"/>
<!--CardView-->
<attr name="cardViewBgColor" format="reference|color"/>
<attr name="cardViewTextTitleColor" format="reference|color"/>
<attr name="cardViewTextBodyColor" format="reference|color"/>
<attr name="cardViewTextHightLightColor" format="reference|color"/>
<attr name="cardViewTextExtraColor" format="reference|color"/>
</resources>

1.2在stytles.xml文件中定义如下属性

<style name="DayTimeModeTheme" parent="AppTheme.NoActionBar">
<item name="cardViewBgColor">#0CB8F6</item>
<item name="cardViewTextTitleColor">#DBDBDB</item>
</style>
<style name="NightTimeModeTheme" parent="AppTheme.NoActionBar">
<item name="colorPrimary">@color/darken</item>
<item name="colorPrimaryDark">@color/black</item>
<item name="colorAccent">@color/dark</item> <item name="android:textColor">#DBDBDB</item>
<item name="android:textColorHighlight">#F9E81E</item>
<item name="android:textColorLink">#242F67</item>
<item name="android:textColorHint">#DBDBDB</item> <item name="cardViewBgColor">#18255D</item>
<item name="cardViewTextTitleColor">#61809E</item>
</style>

1.3在所有的界面文件中使用如下代码(以cardView为例)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<android.support.v7.widget.CardView
android:id="@+id/cv_news"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:cardBackgroundColor="?attr/cardViewBgColor"//这里使用了attr中自定义的属性值
app:cardCornerRadius="10dp"
app:cardElevation="5dp"
app:contentPadding="10dp"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"> <TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="标题"
android:textColor="?attr/cardViewTextTitleColor"//这里使用了attr中自定义的属性值
android:textSize="14sp"/>
<TextView
android:id="@+id/tv_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正文正文正文正文正文正文"
android:textColor="?attr/cardViewTextTitleColor"//这里使用了attr中自定义的属性值
android:textSize="12sp"/>
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>

2、重启activity实现夜间模式【在java代码中的实现部分】

2.1使用SharedPreference当前存储主题状态

博主自定义了SharedPreferrenceHelper类对“主题存储、主题获取、主题切换”的SharedPreference操作进行了封装

package com.neil.dailyzhihu.ui.theme;

import android.content.Context;
import android.content.SharedPreferences; import com.neil.dailyzhihu.Constant;
import com.neil.dailyzhihu.R; public class SharedPreferrenceHelper { public static void settheme(Context context, String theme) {
SharedPreferences sp = context.getSharedPreferences(Constant.SHARED_PREFERANCE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString(Constant.DAY_MODE_THEME, theme);
editor.commit();
} public static String gettheme(Context context) {
SharedPreferences sp = context.getSharedPreferences(Constant.SHARED_PREFERANCE_NAME, Context.MODE_PRIVATE);
return sp.getString(Constant.DAY_MODE_THEME, Constant.DEFAULT_TIME_THEME);
} public static void switchAppTheme(Context context) {
String value = SharedPreferrenceHelper.gettheme(context);
switch (value) {
case Constant.NIGHT_TIME_THEME:
SharedPreferrenceHelper.settheme(context, Constant.DAY_TIME_THEME);
break;
case Constant.DAY_TIME_THEME:
SharedPreferrenceHelper.settheme(context, Constant.NIGHT_TIME_THEME);
break;
}
} public static int getAppTheme(Context context) {
String value = SharedPreferrenceHelper.gettheme(context);
switch (value) {
case Constant.NIGHT_TIME_THEME:
return R.style.DayTimeModeTheme;
case Constant.DAY_TIME_THEME:
return R.style.NightTimeModeTheme;
}
return R.style.DayTimeModeTheme;
}
}

2.2需要切换日夜间模式的activity中的实现

  • 使用夜间模式功能的activity中加入成员变量
private String theme = Constant.DEFAULT_TIME_THEME;
  • onCreate方法中加入如下代码
 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int themeRes = SharedPreferrenceHelper.getAppTheme(this);
theme = SharedPreferrenceHelper.gettheme(this);
setTheme(themeRes);
etContentView(R.layout.activity_main);
}
  • activity中添加如下成员方法
private void reload() {
Intent intent = getIntent();
overridePendingTransition(0, 0);//不设置进入退出动画
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
  • 在需要切换日/夜间模式的地方使用reload();方法

--------------分割线----------------

3、不重启activity实现夜间模式

下次更新

android夜间模式实现的更多相关文章

  1. Android 夜间模式changeskin小结

    @author vivian8725118 @CSDN http://blog.csdn.net/vivian8725118 @简书 http://www.jianshu.com/p/832e9776 ...

  2. Android夜间模式的几种实现

    一.直接修改widget颜色,这种方式实现起来最简单,但需要每个控件都去修改,太过复杂.例如: /** * 相应交互,修改控件颜色 * @param view */public void onMeth ...

  3. Android 高级UI设计笔记24:Android 夜间模式之 WebView 实现白天 / 夜间阅读模式 (使用JavaScript)

    1. 问题引入: 前面我们是使用方法 降低屏幕亮度(不常用) 和 替换theme,两者都是针对Activity的背景进行白天.夜间模式的交换,但是如果我们显示的是Html的内容,这个时候改怎么办? 分 ...

  4. Android 高级UI设计笔记23:Android 夜间模式之 两种常用方法(降低屏幕亮度+替换theme)

    1. 夜间模式 所谓的夜间模式,就是能够根据不同的设定,呈现不同风格的界面给用户,而且晚上看着不伤眼睛.特别是一些新闻类App实现夜间模式是非常人性化的,增强用户体验. 2. 我根据网上的资料 以及自 ...

  5. Android 夜间模式的实现

    package com.loaderman.daynightdemo; import android.os.Bundle; import android.support.v7.app.AppCompa ...

  6. android简单的夜间模式

    现在android项目values下打 attrs.xml <?xml version="1.0" encoding="utf-8"?> <r ...

  7. Android白天/夜间模式Day/Night Mode标准原生SDK实现

     Android白天/夜间模式Day/Night Mode标准原生SDK实现 章节A:Android实现白天/夜间模式主要控制器在于UiModeManager,UiModeManager是Andr ...

  8. Android 之夜间模式(多主题)的实现

    引言 夜间模式其实属于多主题切换的一种,不过是最麻烦的一种.因为在夜间模式下不仅要切换主色调,次要色调等等,还要覆盖一些特殊的颜色,因为在夜间模式下总不能什么都是黑的把,那不得丑死-.-,所以当你夜间 ...

  9. Android实现夜间模式

    如今非常多App都有夜间模式,特别是阅读类的App.夜间模式如今已经是阅读类App的标配了,其实,日间模式与夜间模式就是给App定义并应用两套不同颜色的主题,用户能够自己主动或者手动的开启,今天用An ...

随机推荐

  1. Debian下安装vim

    问题描述:安装完系统以后,刚要打算开始写程序,发现,vim还没有装,用su -切换到root后 直接运行apt-get install vim,提示插入disc源,然后回车,陷入无法解决的状态. 上网 ...

  2. 10 个学习iOS开发的最佳网站(转)

    10 个学习iOS开发的最佳网站 作者 jopen 2012-09-26 08:59:56 1) Apple Learning Objective C Objective-C,通常写作ObjC和较少用 ...

  3. loj 1337

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1337 思路:对于搜过的区域进行标记,如果要求的点落在已经搜过的区域,那么直接取出来即可 ...

  4. 智能车学习(十八)——电机学习

    一.C车电机选择 1.摘要:      因为C车模在四轮车的优势是有两个电机,可以进行主动差速,劣势是电机太弱了....所以如何选择电机,就是个钱的问题了,电机多一点,就比较好选,但是C车电机跑多了就 ...

  5. ubuntu14使用qemu调试linux内核

    # 下载内核源代码编译内核 cd ~/LinuxKernel/ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.x ...

  6. 初识WCF

    以前,总是说自己的基础知识不牢靠,就是因为自己总是不总结.昨天,学费交了,顿时感觉不一样了,心里有劲也有力了,知道了以前的自己到底为什么会那样了,因为没有压力. --题记 我参加过浩哥的招标项目,参加 ...

  7. thinkphp数据表操作恐怖事件。

    1当使用thinkphp的where(array())时,如果里面的字段在数据库是没有的,则默认这个条件为1,这时就可能出现大批修改记录问题.如修改所有用户的密码.特别要注意的是,这里的表字段是区分大 ...

  8. free store VS heap(自由存储区VS堆)

    1. free store VS heap free store (自由存储区)和 heap (堆),在C/C++中经常会遇到.他们是否有区别呢? 偶最早发现这两个概念性问题是在<Excepti ...

  9. 开发Portlet第二步:如何将Crystal静态Portlet转变成基于测试数据的动态Portlet?

    当基于Crystal的静态Portlet开发完成后,在与后台服务联调前,还需要将Portlet转换成基于测试数据的动态Portlet.具体步骤如下: 分步指南 复制Portlet项目,并修改相关的po ...

  10. Android 使用 LruCache 缓存图片

    在你应用程序的 UI 界面加载一张图片是一件很简单的事情,但是当你需要在界面上加载一大堆图片的时候,情况就变得复杂起来.在很多情况下,(比如使用 ListView, GridView 或者 ViewP ...