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字体颜色、大小和页面背景)