Android Them+SharedPreferences 修改程序所有view字体颜色、大小和页面背景
有这么一个需求,可以对页面的样式进行选择,然后根据选择改变程序所有字体颜色和页面背景。同时下一次启动程序,当前设置依然有效。
根据需求,我们需要一种快速,方便,有效的方式来实现需求,然后可以通过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字体颜色、大小和页面背景的更多相关文章
- Android NumberPicker 修改分割线颜色和高度及字体颜色大小
(1)重写NumberPicker已达到修改显示字体颜色大小 public class TextColorNumberPicker extends NumberPicker { public Text ...
- Android SearchView 自定义SearchIcon和字体颜色大小
自定义SearchView的搜索图标和字体属性相对复杂一些,记下来. 一.自定义SearchIcon 1.API版本低于21:版本小于21时,要修改SearchIcon比较复杂,需要先获取到Searc ...
- python设置图片背景和设置字体颜色大小
# -*- coding: utf-8 -*- """ Created on Wed Dec 11 22:37:30 2019 @author: Dell "& ...
- 关于UIAlertAction如何修改sheet上的字体颜色
相信很多程序员都会遇到需求是这样的: 但是你发现无论怎么设置cancel和Destructive都无法让红色字体移动到下面取消按钮上: 其实之前一直用错,用了ios9之前的UIActionSheet这 ...
- android自定义控件实现TextView按下后字体颜色改变
今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能 直接看图片 第一张是按下后截的图,功能很简单, ...
- C# 控制台程序(命令行程序)设置字体颜色,窗口宽高,光标行数
控制台程序(命令行程序)设置窗口宽度高度,如下代码: Console.WriteLine(Console.WindowHeight); Console.WriteLine(Console.Buffer ...
- 如何修改Zend Studio代码字体和大小
Zend Studio的默认字体非常小,看起来很费神,这里教大家怎么修改它的字体和大小. 工具/原料 Zend Studio 方法/步骤 Window-->preferences ...
- WPS修改批注部分的字体颜色?
今天遇到一个问题,就是复制文档的时候有几块红色字体想改成黑色,怎么也改不成功,通过修改字体颜色无效,通过百度找到了解决方法记录一下. 解决方法 审阅--显示标记--点击插入和删除(去掉前面的对钩即可) ...
- NPOI 修改指定单元格字体颜色
//创建一个字体颜色 IFont font = hssfworkbook.CreateFont(); //红色 font.Color = HSSFColor.Red.Index; //样式 ICell ...
随机推荐
- 简单java队列
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. 以下实例演示了队 ...
- Linux & Shell 学习笔记【1/2】
因为工作上的需要,花了些许时间去熟悉学习Linux和Shell,现在也花点事件在此记录一下以加强巩固学习的内容吧.学的不算深入,所以都是一些比较junior的内容. 在下一篇随笔会详述之前写的一个用于 ...
- leetcode签到 892. 三维形体的表面积
题目 三维形体的表面积 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最 ...
- 粒子群优化算法(PSO)之基于离散化的特征选择(FS)(三)
作者:Geppetto 前面我们介绍了特征选择(Feature Selection,FS)与离散化数据的重要性,总览的介绍了PSO在FS中的重要性和一些常用的方法,介绍了FS与离散化的背景,介绍本文所 ...
- Mayor's posters POJ - 2528 线段树(离散化处理大数?)
题意:输入t组数据,输入n代表有n块广告牌,按照顺序贴上去,输入左边和右边到达的地方,问贴完以后还有多少块广告牌可以看到(因为有的被完全覆盖了). 思路:很明显就是线段树更改区间,不过这个区间的跨度有 ...
- xp镜像+激活码
由于一个环境必须要xp环境,安装虚拟机的,没有在msdn下,因为速度慢. Windows XP SP3:http://b.downya.com/600/winxpsp3_downcc.com.iso ...
- Win10远程桌面发生身份验证错误,要求的函数不受支持
昨儿个使用远程桌面,意外发的发现连不上测试环境了.身边的同事也有连不上的.一开始以为是远程机器可能出了问题,但是而后排查确认是自个儿机器问题.原因在与机器前天晚上自动升级了系统补丁,也有部分网友反映了 ...
- WiX 简介
最近研究了一下WIX打包,简单总结一下,方便自己以后查阅,也希望能给需要的人一些提示和帮助. WiX 简介 Windows Installer XML (WiX ) 平台是一组工具与规范,使您能够创建 ...
- Spring Boot创建一个HelloWorld项目
目录 Spring Boot 简介 微服务框架 以前使用spring开发web的方式 Spring Boot 启动器介绍 如何创建一个helloword的SpringBoot项目 Spring Boo ...
- 使用原生方法查询指定元素是否包含指定className
如果我们要查找某个指定元素是否包含指定的className,可以使用以下方法 eg:document.getElementById('Id').classList.contains('要查询的clas ...