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>
  • 相关阅读:
    LeetCode(287)Find the Duplicate Number
    LeetCode(290) Word Pattern
    LeetCode(205)Isomorphic Strings
    LeetCode(201) Bitwise AND of Numbers Range
    LeetCode(200) Number of Islands
    LeetCode(220) Contains Duplicate III
    LeetCode(219) Contains Duplicate II
    命令行执行Qt程序
    LeetCode(228) Summary Ranges
    redis 的安装和使用记录
  • 原文地址:https://www.cnblogs.com/caoRM/p/4480777.html
Copyright © 2011-2022 走看看