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>
时间: 2024-10-23 13:42:45

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

Android NumberPicker控件修改分割线颜色及字体颜色大小

(1)重写NumberPicker已达到修改显示字体颜色大小 public class TextColorNumberPicker extends NumberPicker { public TextColorNumberPicker(Context context) { super(context); } public TextColorNumberPicker(Context context, AttributeSet attrs) { super(context, attrs); } pu

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

自定义SearchView的搜索图标和字体属性相对复杂一些,记下来. 一.自定义SearchIcon 1.API版本低于21:版本小于21时,要修改SearchIcon比较复杂,需要先获取到SearchView的ImageView,然后为ImageView设置图片,具体代码如下: (1)初始化SearchView控件 mSearch = (SearchView) view.findViewById(R.id.search); (2)设置自定义的搜索图标 if(mSearch==null){ re

Android手机在不同分辨率情况下字体自适应大小

两种解决方法: 一. 1.首先根据不同分辨率获取不同字体大小. 在RES里创建values-480x320/strings.xml 里面设置<dimen name="Text_size">30px</dimen>和 values-800x400/strings.xml 里面设置<dimen name="Text_size">30px</dimen> 分别代表480X320 和 800X400分辨率情况下 字号为30px

iOS修改UITextField的Placeholder字体颜色

修改UITextField的Placeholder字体颜色有一下两张方式可以达到效果. 第一种: UIColor *color = [UIColor whiteColor]; textfield.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"用户名" attributes:@{NSForegroundColorAttributeName: color}]; 第二种: [textfield set

css①字体颜色正常显示,背景透明②字体颜色与背景均为透明的设置方法

①字体颜色正常显示,背景颜色透明 color:#fff; background:rgba(0,0,0,0.5);? ②?字体颜色与背景颜色均为透明 color:#fff; background:#000; opacity:0.6;

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

今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能 直接看图片             第一张是按下后截的图,功能很简单,也很容易实现,下面来看一下如何通过重写TextView来实现 一共三个文件  TextViewM.java,MainActivity.java,activity_textview.xml TextViewM.java 1 package landptf.control; 2 3 import and

修改Keil5的编辑器字体颜色

Keil5默认的编辑器颜色比较明亮,不符合熬夜写代码的习惯,下面将字体颜色改成昏暗的风格. 1.点击菜单栏"Edit"--"Configuration",或直接点击工具栏的扳手图标,打开Configuration窗口,并切换至"Color & Fonts"标签,如下: 2.选中"C/C++ Editor files",将所有元素的背景色"Blackgound",都改为红(30).绿(30).蓝(30

(三十七)Android开发中修改程序字体

1.在Android XML文件中设置系统默认的字体 可以在XML文件中采用android:typeface设置字体,例如android:typeface=”monospace”.在这里例子中我们在Activity中对android:text=”Hello, World! 您好”分别进行了四种显示方式,依次为“Sans”,“serif”,“monospace”和系统缺省方式(经试验缺省采用采用sans).英文字体有差异,貌似中文字体没有差异.XML文件如下: <?xml version=“1.0

Android基础TOP2:单机按钮改变字体颜色

---恢复内容开始--- Activity: <TextView android:id="@+id/t1" android:textSize="30dp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="100dp" android:text="