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

根据需求,我们需要一种快速,方便,有效的方式来实现需求,然后可以通过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. 一起了解 .Net Foundation 项目 No.21

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. UWP Community ...

  2. JDBC(三)----JDBC控制事务

    ##  JDBC控制事务 1.事务:一个包含多个步骤的业务操作.如果这个业务员操作被事务管理,则这多个步骤要么同时成功,要么同时失败. 2.操作: 1.开启事务 2.提交事务 3.回滚事务 3.使用C ...

  3. 解析“60k”大佬的19道C#面试题(下)

    解析"60k"大佬的19道C#面试题(下) 在上篇中,我解析了前 10 道题目,本篇我将尝试解析后面剩下的所有题目. 姐妹篇:解析"60k"大佬的19道C#面试 ...

  4. 滑动窗口-Moving Stones Until Consecutive II

    2020-02-20 16:34:16 问题描述: 问题求解: public int[] numMovesStonesII(int[] stones) { int n = stones.length; ...

  5. Hive数据倾斜的原因及主要解决方法

    数据倾斜产生的原因 数据倾斜的原因很大部分是join倾斜和聚合倾斜两大类 Hive倾斜之group by聚合倾斜 原因: 分组的维度过少,每个维度的值过多,导致处理某值的reduce耗时很久: 对一些 ...

  6. Alpine Linux 常用命令

    一:Alpine Linux开启SSH远程登陆 1.简介: 最重要的一个服务了,远程登陆需要用它,文件传输需要用它,必备功能.不管你是在实体机上跑,虚拟机上跑,docker里面跑,这个都是必须的. 2 ...

  7. element-ui 的 单选按钮(Radio) 怎么取消文本显示?

    方法一:<el-radio class="radio" v-model="radio" :label="1"> </el- ...

  8. 使用条件随机场模型解决文本分类问题(附Python代码)

    对深度学习感兴趣,热爱Tensorflow的小伙伴,欢迎关注我们的网站!http://www.tensorflownews.com.我们的公众号:磐创AI. 一. 介绍 世界上每天都在生成数量惊人的文 ...

  9. 学习GAN必须阅读的10篇论文

    本文转载自:魔图互联.欢迎访问网站查看详细教程:Tensorflow(pytorch)系列教程 生成对抗网络是深度学习中最有趣和最受欢迎的应用之一.本文将列出 10 篇关于 GAN 的论文,这些论文详 ...

  10. 1.NET Core 概述

    .NET Core 概述 .NET Core是一个免费的.开源的.跨平台的.广泛使用的Web框架:它是由微软维护的.社区广泛参与支持的一个框架..NET Core可以运行在:Windows.MacOS ...