• Stars
    star
    1,398
  • Rank 33,617 (Top 0.7 %)
  • Language
    Java
  • License
    MIT License
  • Created about 9 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

基于Theme的Android动态换肤库,无需重启Activity、无需自定义View,方便的实现日间、夜间模式。

Android Gems

Colorful 动态换肤开源库

基于Theme的Android动态换肤开源库,以简单的方式实现夜间模式。

  • 【该方案可以用于切换ui样式,但是还不完善,有需要的同学可自行修改框架扩展自己需要的功能】

效果如下:

Demo工程依赖support v7,请自行添加依赖

一、使用方式

1.1 自定义属性

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

    <!-- 自定义属性 -->
    <attr name="root_view_bg" format="reference|color" />
    <attr name="btn_bg" format="reference|color" />
    <attr name="text_color" format="reference|color" />

</resources>

1.2 在布局中使用自定义属性设置View的背景、文本颜色等属性

activity_main.xml中的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/root_view_bg"
    tools:context="com.example.androidthemedemo.MainActivity" >

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="@string/change_theme"
        android:textColor="?attr/text_color"
        android:textSize="20sp" />

    <Button
        android:id="@+id/change_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/textview"
        android:layout_marginTop="20dp"
        android:text="@string/change_theme"
        android:textColor="?attr/text_color" />

    <Button
        android:id="@+id/second_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/change_btn"
        android:layout_marginTop="20dp"
        android:text="@string/sec_act"
         />

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/second_btn"
        android:layout_marginTop="20dp" />

</RelativeLayout>

例如上述布局中我们将root_view的背景设置为"?attr/root_view_bg",代表它的背景是自定义属性root_view_bg的值,还有Textview和Button的textColor属性设置为"?attr/text_color"

1.3 定义多个Theme

然后在不同的Theme中为这些属性设置不同的值,例如,通常我们有日间和夜间模式两种颜色模式。styles.xml中的完整代码如下:

<resources>

    <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
    </style>

    <!-- 日间主题 -->
    <style name="DayTheme" parent="AppTheme">
        <item name="root_view_bg">@drawable/bg_day</item>
        <item name="btn_bg">@color/white_btn_color</item>
        <item name="text_color">@color/black_tx_color</item>
    </style>

    <!-- 夜间主题 -->
    <style name="NightTheme" parent="AppTheme">
        <item name="root_view_bg">@drawable/bg_night</item>
        <item name="btn_bg">@color/black_btn_color</item>
        <item name="text_color">@color/white_tx_color</item>
    </style>

</resources>

两个主题下为同一个属性设置了不同的值,达到切换主题时修改View的相关属性的目的。例如定义在colors.xml中的颜色值。

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

    <!-- 日间模式 -->
    <color name="white_btn_color">#3BB32E</color>
    <color name="black_tx_color">#333333</color>

    <!-- 夜间模式 -->
    <color name="black_btn_color">#aa7788</color>
    <color name="white_tx_color">#f0f0f0</color>

</resources>

1.4 设置要修改的View的属性

下面我们为activity_main.xml中的视图进行换肤设置:

ListView  mNewsListView = (ListView) findViewById(R.id.listview);

// 为ListView设置要修改的属性,在这里没有对ListView本身的属性做修改
ViewGroupSetter listViewSetter = new ViewGroupSetter(mNewsListView, 0);
// 绑定ListView的Item View中的news_title视图,在换肤时修改它的text_color属性
listViewSetter.childViewTextColor(R.id.news_title, R.attr.text_color);


// 构建Colorful对象
Colorful mColorful = new Colorful.Builder(this)
		.backgroundDrawable(R.id.root_view, R.attr.root_view_bg) // 设置view的背景图片
		.backgroundColor(R.id.change_btn, R.attr.btn_bg) // 设置按钮的背景色
		.textColor(R.id.textview, R.attr.text_color) // 设置文本颜色
		.setter(listViewSetter)           // 手动设置setter
		.create(); 

首先我们定义了一个listViewSetter,该Setter用于为ListView的每个Item View中的news_title控件设置文本颜色,文本颜色的值是自定义属性text_color的颜色值。然后构建Colorful对象,并且id分别为change_btn、root_view、textview的控件绑定特定属性值,例如backgroundDrawable(R.id.root_view, R.attr.root_view_bg)代表root_view的背景Drawable为自定义属性root_view_bg的值,textColor(R.id.textview, R.attr.text_color)表示id为textview的TextView控件的文本颜色为R.attr.text_color的值。这些属性都在不同的Theme中有不同的值,因此切换Theme时就会发生变化。然后我们将listViewSetter添加到Colorful对象中,在修改主题时被遍历ListView中的所有Item View,然后修改news_title控件的文本颜色。

1.5 切换主题

最后通过Colorful对象设置主题即可实现切换,代码如下:

boolean isNight = false ;

// 切换主题
private void changeThemeWithColorful() {
    if (!isNight) {
        mColorful.setTheme(R.style.DayTheme);
    } else {
	mColorful.setTheme(R.style.NightTheme);
    }
    isNight = !isNight;
}

More Repositories

1

awesome-english-ebooks

经济学人(含音频)、纽约客、卫报、连线、大西洋月刊等英语杂志免费下载,支持epub、mobi、pdf格式, 每周更新
CSS
20,476
star
2

android-tech-frontier

【停止维护】一个定期翻译国外Android优质的技术、开源库、软件架构设计、测试等文章的开源项目
10,443
star
3

the-economist-ebooks

经济学人(含音频)、纽约客、自然、新科学人、卫报、科学美国人、连线、大西洋月刊、国家地理等英语杂志免费下载、订阅(kindle推送),支持epub、mobi、pdf格式, 每周更新. The Economist 、The New Yorker 、Nature、The Atlantic 、New Scientist、The Guardian、Scientific American、Wired magazines, free download and subscription for kindle, mobi、epub、pdf format.
CSS
8,890
star
4

AndroidEventBus

A lightweight eventbus library for android, simplifies communication between Activities, Fragments, Threads, Services, etc.
Java
1,611
star
5

iOS-tech-frontier

一个定期翻译国外iOS优质的技术、开源库、软件架构设计、测试等文章的开源项目
1,202
star
6

mockito-doc-zh

Mockito框架中文文档
1,113
star
7

android_my_pull_refresh_view

android下拉刷新实现原理【阐述基本原理,不建议使用】
Java
275
star
8

mmat

An automatically testing and analysis hprof library for android app (自动分析Android内存泄漏)
Java
178
star
9

simple_net_framework

SimpleNet网络框架,仅供学习参考,不推荐使用,不进行维护。
Java
139
star
10

android_dp_analysis_code

《Android 源码设计模式解析与实战》示例代码
Java
130
star
11

the-tech-frontier-app

The Android App for Tech Frontier
Java
121
star
12

simple_imageloader

A Simple ImageLoader for Android 【不建议使用到项目中,仅作示例】
Java
120
star
13

commonadapter

通用的ListView、RecyclerView的Adapter
Java
107
star
14

app-test-arch

Android 单元测试、Monkey、LeakCanary测试demo项目【粗略示例】
Java
98
star
15

android_jtm_sourcecode

Java
85
star
16

SimpleTvIME

简单的Android Tv远程遥控器 & 输入法 【不进行维护】
Java
79
star
17

dp-issues

Android源码设计模式解析与实战勘误
70
star
18

Chris-Android-PullToRefresh

在Chris Banes的Android-PullToRefresh的基础上增加了RecyclerView的支持与Demo
Java
56
star
19

ripplelayout

RippleLayout library
Java
50
star
20

the-hot-tech-blogs

每周六会从掘金抓取7天内最热门Android、iOS、后端、前端各20篇技术文章, 然后制作成 mobi、epub 格式的电子书推送给订阅者, 支持推送到kindle 设备、kindle手机app、普通邮箱.
42
star
21

SegmentView

This is a Android Segment Control ( View ) like iOS, support 2.3 and above.
Java
39
star
22

materiallayout

materiallayout library and demo.
Java
34
star
23

listview_nested_gridview

ListView嵌套GridView的消息流页面,解决了GridView高度和宽度问题
Java
32
star
24

jtm-techfrontier-app

Java
31
star
25

CrashCanary

Crash Log Viewer
Java
30
star
26

leakcanary-for-eclipse

用于eclipse的leakcanary
Java
30
star
27

AndroidShakeLib

Android 摇一摇手机功能
Java
23
star
28

android-jtm-issues

《Android开发进阶-从小工到专家》勘误
23
star
29

InjectDagger

Java
22
star
30

ErasableTextView

仿支付宝刮奖效果,自定义view
Java
20
star
31

umeng-social-custom-shareui

custom ui
Java
19
star
32

AndroidMvpBase

Android MVP Base Library
Java
18
star
33

simpledb

A Lightweight android database library
Java
12
star
34

AndroidImageBrowser

Android Image Browser
Java
12
star
35

tech-frontier-mvp

8
star
36

common_adapter_viewholder

common_adapter_viewholder
Java
7
star
37

FastScrollLayout

Android fast scroll layout from ListView
Java
6
star
38

te_audios

The Economist audio
5
star
39

Java-23-Design-Patterns

23 design patterns
Java
5
star
40

MockServer

mock server with Go
Go
4
star
41

mdict-analysis

Python
4
star
42

SimpleTask

A Simple Task Library to use AsyncTask easier.
Java
4
star
43

en_dict

3
star
44

bboyfeiyu.github.io

Blog repository
HTML
3
star
45

hehonghui.github.io

HTML
3
star
46

images_gridview_gallery

扫描本地图片,多图选择,异步加载,图片错位示例
Java
3
star
47

LoveWeRead

Java
3
star
48

zapr-sdk-sample-app

Java
2
star
49

SimpleNote

Java
2
star
50

fribidi

C
1
star
51

MusicPlayer2

MusicPlayer
C++
1
star
52

VolleyModule

使用Volley时封装的简单工具类
Java
1
star
53

GradleDemo

Java
1
star
54

dev-tech-frontier

开发技术前线
1
star
55

AndroidEventBus_maven

1
star