有这么一个需求,可以对页面的样式进行选择,然后根据选择改变程序所有字体颜色和页面背景。同时下一次启动程序,当前设置依然有效。

根据需求,我们需要一种快速,方便,有效的方式来实现需求,然后可以通过Android Them + SharedPreferences 来实现需求。Them用于存放设置的每一种样式,并应用于程序中,SharedPreferences用于记住程序当前的样式,根据SharedPreferences的内容来设置程序的样式,实现下次启动能够oncreat当前的样式设置。

这里的Them比较简单,只是定义了字体颜色和页面背景颜色。在res/values/styles.xml 文件中增加Them主题

    <style name="FirstThem">
<item name="android:textColor">@color/FirstThemTextColor</item> <!-- 字体颜色 -->
<item name="android:windowBackground">@color/FirstThemBackgroundColor</item> <!-- 窗口背景 -->
</style> <style name="SecondThem">
<item name="android:textColor">@color/SecondThemTextColor</item> <!-- 字体颜色 -->
<item name="android:windowBackground">@color/SecondThemBackgroundColor</item> <!-- 窗口背景 -->
</style> <style name="ThirdThem">
<item name="android:textColor">@color/ThirdThemTextColor</item> <!-- 字体颜色 -->
<item name="android:windowBackground">@color/ThirdThemBackgroundColor</item> <!-- 窗口背景 -->
</style>

然后在MainActivity.java中创建SharedPreferences来记录样式的状态

    private void SharePreference() {
sharePrefences=this.getSharedPreferences("config",Context.MODE_WORLD_READABLE
| Context.MODE_WORLD_WRITEABLE);
editor=sharePrefences.edit();
boolean isThem = sharePrefences.getBoolean("isThem", false);
int Them = sharePrefences.getInt("Them",0);//config不存在时返回0
if(isThem){
if(Them==1){
setTheme(R.style.FirstThem);
}else if(Them==2){
setTheme(R.style.SecondThem);
}else if(Them==3){
setTheme(R.style.ThirdThem);
}
}else{//sharePrefences不存在是使用默认主题
setTheme(R.style.FirstThem);
}
}

有两个比较值得注意的地方是:

1、设置主题时,setTheme(R.style.FirstThem);一定要放在setContentView(R.layout.activity_main);前,否则无效。

setTheme(R.style.FirstThem);
setContentView(R.layout.activity_main);

2、要所有页面的字体颜色和背景能够根据Them去改变,那么布局文件中的目标控件都不能设置android:textcolor,以及android:background.否则控件的android:textcolor,android:background属性会将Them的设置覆盖。

下面是一个demo的完整代码:

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <Button
android:id="@+id/FirstThem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="样式一"
/> <Button
android:id="@+id/SecondThem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="样式二"
/> <Button
android:id="@+id/ThirdThem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="样式三"
/> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="50dp"
android:textSize="30sp"
android:text="ABCDEFG"
/> </LinearLayout>

MainActivity.java

public class MainActivity extends Activity implements OnClickListener {
private Button FirstThemButton;
private Button SecondThemButton;
private Button ThirdThemButton;
private SharedPreferences sharePrefences;
private Editor editor; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharePreference();
setContentView(R.layout.activity_main);
InitView();
FirstThemButton=(Button) findViewById(R.id.FirstThem);
SecondThemButton=(Button) findViewById(R.id.SecondThem);
SecondThemButton=(Button) findViewById(R.id.ThirdThem);
} private void SharePreference() {
sharePrefences=this.getSharedPreferences("config",Context.MODE_WORLD_READABLE
| Context.MODE_WORLD_WRITEABLE);
editor=sharePrefences.edit();
boolean isThem = sharePrefences.getBoolean("isThem", false);
int Them = sharePrefences.getInt("Them",0);//config不存在时返回0
if(isThem){
if(Them==1){
setTheme(R.style.FirstThem);
}else if(Them==2){
setTheme(R.style.SecondThem);
}else if(Them==3){
setTheme(R.style.ThirdThem);
}
}else{//sharePrefences不存在是使用默认主题
setTheme(R.style.FirstThem);
}
} private void InitView() {
FirstThemButton=(Button) findViewById(R.id.FirstThem);
SecondThemButton=(Button) findViewById(R.id.SecondThem);
ThirdThemButton=(Button) findViewById(R.id.ThirdThem);
FirstThemButton.setOnClickListener(this);
SecondThemButton.setOnClickListener(this);
ThirdThemButton.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.FirstThem:
editor.putBoolean("isThem", true);
editor.putInt("Them", 1);
editor.commit();
Intent intent1=new Intent(this,MainActivity.class);
startActivity(intent1);
break;
case R.id.SecondThem:
editor.putBoolean("isThem", true);
editor.putInt("Them",2);
editor.commit();
Intent intent2=new Intent(this,MainActivity.class);
startActivity(intent2);
break;
case R.id.ThirdThem:
editor.putBoolean("isThem", true);
editor.putInt("Them", 3);
editor.commit();
Intent intent3=new Intent(this,MainActivity.class);
startActivity(intent3);
break;
default:
break;
} } }

styles.xml

<resources>

    <!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here.
-->
</style> <!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style> <style name="FirstThem">
<item name="android:textColor">@color/FirstThemTextColor</item> <!-- 字体颜色 -->
<item name="android:windowBackground">@color/FirstThemBackgroundColor</item> <!-- 窗口背景 -->
</style> <style name="SecondThem">
<item name="android:textColor">@color/SecondThemTextColor</item> <!-- 字体颜色 -->
<item name="android:windowBackground">@color/SecondThemBackgroundColor</item> <!-- 窗口背景 -->
</style> <style name="ThirdThem">
<item name="android:textColor">@color/ThirdThemTextColor</item> <!-- 字体颜色 -->
<item name="android:windowBackground">@color/ThirdThemBackgroundColor</item> <!-- 窗口背景 -->
</style> </resources>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="FirstThemTextColor">#000000</color>
<color name="FirstThemBackgroundColor">#FFFFFF</color>
<color name="SecondThemTextColor">#AAAAAA</color>
<color name="SecondThemBackgroundColor">#EEBBEE</color>
<color name="ThirdThemTextColor">#CCCCCC</color>
<color name="ThirdThemBackgroundColor">#AAAADD</color>
</resources>

Android Them+SharedPreferences 修改程序所有view字体颜色、大小和页面背景的更多相关文章

  1. Android NumberPicker 修改分割线颜色和高度及字体颜色大小

    (1)重写NumberPicker已达到修改显示字体颜色大小 public class TextColorNumberPicker extends NumberPicker { public Text ...

  2. Android SearchView 自定义SearchIcon和字体颜色大小

    自定义SearchView的搜索图标和字体属性相对复杂一些,记下来. 一.自定义SearchIcon 1.API版本低于21:版本小于21时,要修改SearchIcon比较复杂,需要先获取到Searc ...

  3. python设置图片背景和设置字体颜色大小

    # -*- coding: utf-8 -*- """ Created on Wed Dec 11 22:37:30 2019 @author: Dell "& ...

  4. 关于UIAlertAction如何修改sheet上的字体颜色

    相信很多程序员都会遇到需求是这样的: 但是你发现无论怎么设置cancel和Destructive都无法让红色字体移动到下面取消按钮上: 其实之前一直用错,用了ios9之前的UIActionSheet这 ...

  5. android自定义控件实现TextView按下后字体颜色改变

    今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能 直接看图片             第一张是按下后截的图,功能很简单, ...

  6. C# 控制台程序(命令行程序)设置字体颜色,窗口宽高,光标行数

    控制台程序(命令行程序)设置窗口宽度高度,如下代码: Console.WriteLine(Console.WindowHeight); Console.WriteLine(Console.Buffer ...

  7. 如何修改Zend Studio代码字体和大小

    Zend Studio的默认字体非常小,看起来很费神,这里教大家怎么修改它的字体和大小.   工具/原料   Zend Studio 方法/步骤     Window-->preferences ...

  8. WPS修改批注部分的字体颜色?

    今天遇到一个问题,就是复制文档的时候有几块红色字体想改成黑色,怎么也改不成功,通过修改字体颜色无效,通过百度找到了解决方法记录一下. 解决方法 审阅--显示标记--点击插入和删除(去掉前面的对钩即可) ...

  9. NPOI 修改指定单元格字体颜色

    //创建一个字体颜色 IFont font = hssfworkbook.CreateFont(); //红色 font.Color = HSSFColor.Red.Index; //样式 ICell ...

随机推荐

  1. hbase 面试问题汇总

    一.Hbase的六大特点: (1).表大:一个表可以有数亿行,上百万列. (2).无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态增加,同一个表中的不同行的可以有截然不同的列. (3) ...

  2. Python第五章-内置数据结构04-字典

    Python 内置的数据结构 四.字典(dict) 字典也是 python 提供给我们的又一个非常重要且有用的数据结构. 字典在别的语言中有时叫关联数组.关联内存.Map等. 字典中存储的是一系列的k ...

  3. layer弹层插件

      // 使用前需要引入jquery的支持,链接如下:   https://blog-static.cnblogs.com/files/liguanlong/jquery1.9.1.min.js    ...

  4. PyTorch专栏(一)

    专栏目录: 第一章:PyTorch之简介与下载 PyTorch简介 PyTorch环境搭建 第二章:PyTorch之60min入门 PyTorch 入门 PyTorch 自动微分 PyTorch 神经 ...

  5. CSRF的几种防御方法的利弊分析

    本文直接从防御方式开始讨论,防御CSRF有4种方法: 使用POST替代GET 检验HTTP Referer 验证码 Token 使用POST替代GET 一些程序员在开发的时候都是用GET.POST通用 ...

  6. 好记性-烂笔头:JDK8流操作

    1):对象 List<User> 转 Map<String,Object> 案例如下: public class User { private Integer id; priv ...

  7. 如何有效的阅读JDK源码

    阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃<Core Java>,那样 ...

  8. JVM中内存分配策略及堆和栈的比较

    最近愈发对JVM底层的运行 原理产生了兴趣,遂查阅相关资料以备忘. 内存分配策略 根据编译原理的观点,程序运行时的内存分配,有三种策略,分别为静态的.堆式的.栈式的. 静态存储分配指的是在编译时就能确 ...

  9. 玩转redis-简单消息队列

    使用go语言基于redis写了一个简单的消息队列 源码地址 使用demo redis的 list 非常的灵活,可以从左边或者右边添加元素,当然也以从任意一头读取数据 添加数据和获取数据的操作也是非常简 ...

  10. JAVA WEB随笔

    servlet生命周期: 1.构造器(单利)2.init(单例)3.service(多例,每次请求都会执行)4.销毁方法destroyservlet解析客户端请求流程:1.web客户端向servlet ...