Android Studio(Java):根据手机模式切换背景颜色
实现日间/夜间模式切换布局背景色
方法一:用Android原生夜间模式(推荐)
Android从API 17开始原生支持夜间模式,系统会自动匹配对应资源,不用手动写太多逻辑。
创建分模式的颜色资源
在res目录下新建values-night文件夹,然后在两个目录下分别创建colors.xml:- 日间模式(
res/values/colors.xml):<?xml version="1.0" encoding="utf-8"?> <resources> <color name="bg_color">#FFFFFF</color> <!-- 白色背景 --> </resources> - 夜间模式(
res/values-night/colors.xml):<?xml version="1.0" encoding="utf-8"?> <resources> <color name="bg_color">#0000FF</color> <!-- 蓝色背景 --> </resources>
- 日间模式(
布局中引用统一颜色名
给布局根节点设置背景为@color/bg_color,系统会根据当前模式自动加载对应颜色:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/bg_color"> <!-- 你的其他控件 --> </LinearLayout>代码里切换模式
在按钮点击或其他触发逻辑里调用系统方法切换模式,Activity会自动重建并加载对应资源:// 切换到夜间模式 getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES); // 切换到日间模式 getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO); // 跟随系统设置的模式 getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
方法二:手动管理模式状态(兼容低版本/自定义逻辑)
如果要兼容API 17以下,或者需要自己控制模式的存储逻辑,可以用SharedPreferences保存状态,手动设置背景色。
保存模式状态
在切换按钮的点击事件里,记录当前模式并重启Activity生效:SharedPreferences sp = getSharedPreferences("mode_config", MODE_PRIVATE); boolean isNight = sp.getBoolean("is_night_mode", false); // 切换模式状态 sp.edit().putBoolean("is_night_mode", !isNight).apply(); // 重启Activity让设置生效 recreate();启动时设置背景色
在Activity的onCreate方法里读取保存的状态,给布局设置对应背景:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences sp = getSharedPreferences("mode_config", MODE_PRIVATE); boolean isNight = sp.getBoolean("is_night_mode", false); // 获取布局根视图 View root = findViewById(android.R.id.content); if (isNight) { root.setBackgroundColor(getResources().getColor(R.color.blue)); } else { root.setBackgroundColor(getResources().getColor(R.color.white)); } // 记得在res/values/colors.xml里定义<color name="white">#FFFFFF</color>和<color name="blue">#0000FF</color> }
内容的提问来源于stack exchange,提问作者Mikandre
相关产品推荐
相关产品推荐

