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 ...
随机推荐
- payload分离免杀
shellcode loader 借助第三方加载器,将shellcode加载到内存中来执行. https://github.com/clinicallyinane/shellcode_launcher ...
- Postman-OAuth 2.0授权
一.Postman提供的授权类型有10种.授权过程将验证是否有权从服务器访问所需的数据.发送请求时,通常必须包含参数以确保请求有权访问并返回所需的数据. 二.使用第7种OAuth 2.0授权:OAut ...
- Django ajax的简单使用、自定义分页器
一. ajax初识 1. 前后端传输数据编码格式contentType 使用form表单向后端提交数据时,必须将form表单的method由默认的get改为post,如果提交的数据中包含文件,还要将f ...
- cmdb autoserver端表数据分析
目录: 1.后台目录规划 autoserver: api: 接收数据并进行二次分析入库 API验证 backend : 负责后台管理 repository:负责管理模型类 (数据表) autoserv ...
- 大多数人不知道的表格其他写法的onmouseover效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- [尊老爱幼] Queen
You are given a rooted tree with vertices numerated from 1 to n . A tree is a connected graph withou ...
- Javascript之实现页面倒计时效果
本文将从需求实现的角度,逐步讲解如何在页面上实现倒计时效果,其中部分涉及到的知识会做拓展讲解,最后将所有代码封装,适用于不同情况下倒计时功能的实现. 效果图 一.分析需求 要实现倒计时效果,可拆解为以 ...
- Linux Cgroup 入门教程:cpuset
这是 Cgroup 系列的第四篇,往期回顾: Linux Cgroup 入门教程:基本概念 Linux Cgroup 入门教程:CPU Linux Cgroup 入门教程:内存 通过上篇文章的学习,我 ...
- redis++:Redis的两种持久化 RDB 和 AOF
Redis持久化备份数据的方式有两种:RDB(Redis DataBase) . AOF(Append Only File). RDB 什么是RDB: 在指定时间间隔内,将内存中的数据集快照写入磁盘 ...
- Thread Future模式
多线程不管是extends Thread 还是 implements Runnable 都是要重写run 方法来实现,这两种方式子线程都没有返回值. 如果要实现主线程对子线程的监听,让子线程有返回值, ...