Android应用开发中的夜间模式实现(一)

前言

在应用开发中会经常遇到要求实现夜间模式或者主题切换
具体例子如下,我会先讲解第一种方法。

夜间模式

  1. 知乎
  2. 网易新闻
  3. 沪江开心词场
  4. Pocket

主题切换

  1. 腾讯QQ
  2. 新浪微博

我今天主要是详述第一种的实现方式:

  1. 首先,应用的Application要继承自定义的Theme

1

2

3

4

5

6


<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme">

</application>

  1. 其实AppTheme要实现日间和夜间两种Theme

1

2

3

4

5

6

7

8

9


<style name="AppTheme"/>

<style name="AppTheme.Light">

<item name="root_background">@color/white</item>

</style>

<style name="AppTheme.Dark">

<item name="root_background">@color/black</item>

</style>

  1. 在自定义属性attr.xml中添加如下:

1

2

3


<declare-styleable name="Theme">

<attr name="root_background" format="reference|color" />

</declare-styleable>

  1. 在layout中引用自定义属性

1

2

3

4

5

6


<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="?attr/root_background">

</RelativeLayout>

  1. 代码中设置切换:所有Activity都继承BaseThemeActivity,将是否夜间模式的bool值保存在SharedPreferences中切换 SharedPreferences 中 is_night_mode 的值 ,然后调用 restartActivity()重启当前Activity方法即可切换Theme.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36


@Override

protected void onCreate(Bundle savedInstanceState) {

setTheme();

super.onCreate(savedInstanceState);

}

private void setTheme() {

mCurrentThemeResourceID = getThemeResourceID();

setTheme(mCurrentThemeResourceID);

}

private int getThemeResourceID() {

mIsNightModule = PreferencesUtils.getBoolean(this, getResources().getString(R.string.is_night_mode));

return mIsNightModule ? R.style.AppTheme_Dark : R.style.AppTheme_Light;

}

public static void restartActivity(final Activity activity) {

if (activity == null) return;

final int enter_anim = android.R.anim.fade_in;

final int exit_anim = android.R.anim.fade_out;

activity.overridePendingTransition(enter_anim, exit_anim);

activity.finish();

activity.overridePendingTransition(enter_anim, exit_anim);

activity.startActivity(activity.getIntent());

}

private final boolean isThemeChanged() {

return getThemeResourceID() != mCurrentThemeResourceID;

}

@Override

protected void onResume() {

super.onResume();

if (isThemeChanged()) {

restartActivity(this);

}

}

总结

    1. 其中要注意的是setTheme()方法一定要在super.onCreate(savedInstanceState);之前调用即可
    2. 可用此方式实现多种theme的切换

      以后会发博文讲解如何实现主题下载,主题切换等功能。

      如果想和我讨论,请在下面评论即可。

时间: 2024-08-05 09:13:25

Android应用开发中的夜间模式实现(一)的相关文章

Android实际开发中的bug总结与解决方法(一)

                                                                             Android实际开发中的bug总结与解决方法(一) Android开发中有很多bug,我们是完全可以在线下避免的,不要等到线上报的BUG的再去修复.下面是我在实际开发中遇到过的bug和解决方法. BUG 1: java.lang.RuntimeException: Unable to start activity ComponentInfo

稍微谈一下 javascript 开发中的 MVC 模式

随着前台开发日益受到重视,客户端代码比重日益增加的今天,如何在javascript开发里应用MVC模式,这个问题似乎会一直被提到,所以偶在这里粗略的谈一下自己的看法吧. MVC模式的基本理念,是通过把一个application封装成model, view和controller三个部分达到降低耦合,简化开发的目的.这么说很空洞,大家可以实际看个例子: 1<select id="selAnimal"> 2    <option value="cat"&

Android应用开发中的风格和主题(style,themes)(转)

Android应用开发中的风格和主题(style,themes) 越来越多互联网企业都在Android平台上部署其客户端,为了提升用户体验,这些客户端都做得布局合理而且美观.......Android的Style设计就是提升用户体验的关键之一.Android上的Style分为了两个方面: Theme是针对窗体级别的,改变窗体样式: Style是针对窗体元素级别的,改变指定控件或者Layout的样式.      Android系统的themes.xml和style.xml(位于\base\core

Android应用开发中三种常见的图片压缩方法

Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 一.质量压缩法 private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里

android游戏开发中图形绘制:Canvas和Paint的使用

android游戏开发中,使用android.graphics中的类来绘制2D向量图和文字. 一 画布Canvas 在Android中的绘图应该继承View组件,并重写它的onDraw(Canvas canvas)方法. Canvas代表指定View上的画布,常用方法如图: 二 画刷Paint Paint代表Canvas上的画刷,主要用于绘制风格,包括画刷颜色.画刷笔触粗细.填充风格等. 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关. 常用方法如图: 三 路径Path Path表示

Android应用开发中对Bitmap的内存优化

在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图片的内存优化,是Android应用开发中比较重要的内容. 1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收.这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间.那为什么还需

Android 应用开发中如何自定义 Drawable 背景?

2020-02-06 关键字:EditText自定义背景.shape.corners 通过 xml 定义 View 的背景 Drawable 资源还是挺常用的. 本篇博文记录几种常用的自定义 Drawable 方式. 1.圆角矩形 A.普通圆角矩形 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/

Android实际开发中的首页框架搭建(二、首页框架实现)

本来这一篇是前两天就要写的,奈何事多缠身,推到今日,为自己的拖延感到愧疚... 上一篇大概把项目的结构完成了,下一步就是实现首页切换功能了 首先在activity目录下新建一个HomeActivity,作为承载多个fragment的容器 代码如下 1 /* 2 * * 3 * * ******************************************************* 4 * * 5 * * @文件名称:HomeActivity.java 6 * * @文件作者:ouyan

ReactJS React+Redux+Router+antDesign通用高效率开发模板,夜间模式为例

工作比较忙,一直没有时间总结下最近学习的一些东西,为了方便前端开发,我使用React+Redux+Router+antDesign总结了一个通用的模板,这个技术栈在前端开发者中是非常常见的. 总的来说,我这个工程十分便捷,对于初学者来说,可能包含到以下的一些知识点: 一.React-Router的使用 Router是为了方便管理组件的路径,它使用比较简单,一般定义如下就行,需要注意的是,react-router的版本有1.0-3.0,各个版本对应的API大致相似,但也有不同,我使用的是2.X的,