欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android 画面风格切换(夜间模式/日间模式) (有小坑没解决)

程序员文章站 2022-05-14 23:51:33
...

谨以此文纪念踩过的小坑坑.



结构目录

android 画面风格切换(夜间模式/日间模式) (有小坑没解决)


首先 , color.xml,  定义每一套需要用到的color

例如:   我这里是用两套来举例说明

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>


    <color name="colorPrimaryq">#565760</color>
    <color name="colorPrimaryDarkq">#ffffff</color>
    <color name="colorAccentq">#16c822</color>
</resources>

然后, 定义style 里面的theme

需要注意的是需要继承一下,然后调用的是继承后的

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="textLight">@color/colorPrimary</item>
        <item name="textNight">@color/colorPrimaryDark</item>
        <item name="appBg">@color/colorAccent</item>
    </style>

    <style name="AppThemeNight" parent="Theme.AppCompat.DayNight.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="textLight">@color/colorPrimaryq</item>
        <item name="textNight">@color/colorPrimaryDarkq</item>
        <item name="appBg">@color/colorAccentq</item>
    </style>

    // 需要注意的是这里需要继承一下, 以后调用的是这个
    <style name="AppThemeII" parent="AppTheme"/>
    <style name="AppThemeNightII" parent="AppThemeNight"/>


</resources>


继续attrs 文件,

后面的format 是转化格式, 自行百度了解

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="textLight" format="reference|color" />
    <attr name="textNight" format="reference|color" />
    <attr name="appBg" format="reference|color" />
</resources>



以上values 文件中就定义完成



那么 在MainActivity 里面调用代码:

需要注意的是, 切换theme 需要写在 setContentView( )   前面;

public class MainActivity extends AppCompatActivity {

    // true 为白天 false 为黑天

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SharedPreferences sharedPreferences = this.getSharedPreferences("CNBLOG", Context.MODE_PRIVATE);
        boolean a =  sharedPreferences.getBoolean("theme", false);

        if (a) {
            
           setTheme(R.style.AppThemeII);
        } else {
            setTheme(R.style.AppThemeNightII);
        }

        setContentView(R.layout.activity_main);

        TextView tv_theme = (TextView) findViewById(R.id.theme);
        tv_theme.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean a1 = SPHelper.getTheme(v.getContext());
//                Log.d("MainActivity", "a:" + a1);
//                Log.d("MainActivity", "SPHelper.getTheme(v.getContext()):" + SPHelper.getTheme(v.getContext()));
                SharedPreferences sharedPreferences = getSharedPreferences("CNBLOG", Context.MODE_PRIVATE);
                sharedPreferences.edit().putBoolean("theme", !a1).commit();
                final Intent themeintent = getIntent();
                // 重新入栈 刷新activity
               themeintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
                startActivity(themeintent);
                overridePendingTransition(0, 0);

            }
        });
    }
}


R.layout.activity_main:

颜色由

?attr/appBg
这种写法代替

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/appBg"
    tools:context="com.example.song.changestyle.MainActivity">

    <TextView
        android:textSize="20sp"
        android:id="@+id/theme"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/shapee"
        android:text="Hello World!"
        android:textColor="?attr/textNight"/>
</RelativeLayout>


shapee.xml

需要加上版本控制, drawable 中只有在版本v21 以上才好用

所以 在新建xml 时候Directory name 里面应该加上版本控制  drawable-v21 或者点击Version 填入21

?代表多个可选值

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="?attr/appBg"/>
    <corners android:radius="2dp" />
    <stroke android:color="?attr/textLight" android:width="3dp"/>
</shape>



tips

小技巧, 在设置页面设置后返回mainAty

intent  回去, 然后finish();
overridePendindTransition(0,0);

注意MainAty  在清单文件 需要设置为   android:launchMode="singleTask"






低版本有什么好的解决办法, 欢迎大家留言一起探讨~~~