zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    windows 10 下部署WCF 一些细节
    系统提示 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。
    zookeeper常用命令
    zookeeper安装与配置
    Java访问者模式
    总结设计模式—(大话设计模式下篇)
    总结设计模式—(大话设计模式中篇)
    总结设计模式—(大话设计模式上篇)
    Java中间缓存变量机制
    解释模式
  • 原文地址:https://www.cnblogs.com/caoRM/p/4480777.html
Copyright © 2011-2022 走看看