日夜间模式切换

  日夜间模式切换两种方式

第一种

创建values-night与drawable-night文件夹,将values中的colors.xml与strings.xml文件copy到values-night中,

切换日夜间模式中,系统自己会寻找文件,切换的夜间时,就会自动使用drawable-night,values-night中的设置


原values中color.xml的内容

原values中strings.xml的内容


values-night中color.xml的内容


values-night中strings.xml的内容


原values中styles.xml的内容,其中继承类发生变化,继承的是:Theme.AppCompat.DayNight.DarkActionBarT:

drawable与drawable-night中存放图片,如果你想要切换日夜间模式,图片也相应变化,就必须将相对应的图片名字起成相同的名字。


一切设置好之后需在布局xml文件中引用,假如你想在切换日夜间模式时,文字字体颜色发生变化,就将textColor引用你已经定义好的colors.xml的main_textView


定义一个MyApplication类继承Application类

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        if (getSharedPreferences("theme", MODE_PRIVATE).getBoolean("night_theme", false)) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        }

    }
}
MainActivity类

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btnChangeTheme = (Button) findViewById(R.id.btnChangeTheme);

        btnChangeTheme.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //切换日夜间模式
                int uiMode;
                uiMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
                switch (uiMode) {
                    case Configuration.UI_MODE_NIGHT_YES:
                        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                        getSharedPreferences("theme", MODE_PRIVATE).edit().putBoolean("night_theme", false).commit();
                        break;
                    case Configuration.UI_MODE_NIGHT_NO:
                        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                        getSharedPreferences("theme", MODE_PRIVATE).edit().putBoolean("night_theme", true).commit();
                        break;
                }
                //重建
                recreate();
            }
        });
    }

第二种

在values包下创一个attrs.xml,其中内容为:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <attr name="textColorValue" format="color"></attr>
    <attr name="textContent" format="string"></attr>
</resources>
在values下的strings.xml中新加两个字段:夜间模式与日间模式

<resources>
    <string name="app_name">ChangeThemeTwo</string>
    <string name="change_to_night">夜间模式</string>
    <string name="change_to_day">日间模式</string>
</resources>
在values下的styles.xml中的更改

<resources>

    <!-- Base application theme. 日间模式-->
    <style name="day_theme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowBackground">@color/white</item>

        <!--日间模式对应的字体颜色 和日间模式对应的文本内容-->
        <item name="textColorValue">@color/black</item>
        <item name="textContent">@string/change_to_night</item>
    </style>
    
    <!-- Base application theme. 夜间模式-->
    <style name="night_theme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/black</item>
        <item name="colorPrimaryDark">@color/dark_bg</item>
        <item name="colorAccent">@color/dark_bg1</item>
        <item name="android:windowBackground">@color/black</item>

        <!--夜间模式对应的字体颜色 和夜间模式对应的文本内容-->
        <item name="textColorValue">@color/white</item>
        <item name="textContent">@string/change_to_day</item>
    </style>

</resources>
在AndroidManifest.xml清单文件中有所更改,theme中需更改为使用day_theme日间模式

在自己布局文件xml中,引用方式如下:


创建一个ThemeUtil类

public class ThemeUtil {
    //我当前应用的主题
    private static int theme = 0;

    //日间模式主题
    private static final int DAY_THEME = 0;

    //夜间模式主题
    private static final int NIGHT_THEME = 1;
    public static void onActivityCreateSetTheme(Activity activity){
        switch (theme){
            case DAY_THEME:
                activity.setTheme(R.style.day_theme);
                break;
            case NIGHT_THEME:
                activity.setTheme(R.style.night_theme);
                break;
        }
    }
    //点击按钮改变对应得主题
    public static void ChangeCurrentTheme(Activity activity) {

        //1、改变当前主题的theme变量
        switch (theme) {
            case DAY_THEME:
                theme = NIGHT_THEME;
                break;
            case NIGHT_THEME:
                theme = DAY_THEME;
                break;
        }

        //2、重启这个activity
        activity.finish();
        //为了切换没换,设置了动画效果
       activity.overridePendingTransition(R.anim.sliding_in, R.anim.sliding_out);
        activity.startActivity(new Intent(activity, activity.getClass()));
    }
}

在res下创建anim存放动画布局

sliding_in中的内容

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="0.0"
    android:toAlpha="1.0"
    android:duration="1000">

</alpha>
sliding_out中的内容

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    android:duration="1000">

</alpha>

MainActivity类

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置对应的主题 ,在ui创建好之后设置主题无效,所以要放到setContentView()方法前面setTheme()
        ThemeUtil.onActivityCreateSetTheme(MainActivity.this);
        setContentView(R.layout.activity_main);
        Button btnChangeTheme = (Button) findViewById(R.id.btnChangeTheme);
        btnChangeTheme.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //切换日夜间模式
                ThemeUtil.ChangeCurrentTheme(MainActivity.this);
            }
        });
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperMonsterH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值