android 如何在白天模式下,拿到深色/暗夜模式下的drawable 请举例
时间: 2024-09-08 09:03:27 浏览: 41
在Android中,如果你想要在应用的白天模式(通常是默认的亮色主题)和深色/暗夜模式(通常被称为夜间模式或黑暗主题)之间切换资源,比如Drawable图标、背景图片等,你可以通过以下步骤来实现:
1. **创建资源文件**:
- 为每个模式创建两个版本的Drawable,如白天模式下的`drawable/day_icon.png` 和 深色模式下的`drawable/dark_day_icon.png`。
- 对于颜色变化较大的元素,还可以创建XML文件(如`dimens.xml`),其中包含不同的尺寸值供两种模式使用。
2. **主题和样式**:
- 在`styles.xml`文件中,定义两种主题,一个是`Theme.AppCompat.Light.NoActionBar`(白天模式),另一个可能是`Theme.AppCompat.Dark.NoActionBar`(夜间模式)。
- 使用`colorPrimaryDark`属性设置主色调,这将影响状态栏和导航栏的颜色。
3. **启用/检测主题更改**:
- 在AndroidManifest.xml中添加`<application>`标签的`android:theme`属性,设置默认主题。
- 在需要获取当前模式的地方,可以使用`getResources().getConfiguration().uiMode`来检查是否处在夜间模式。例如:
```java
int nightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
boolean isNightMode = (nightMode == Configuration.UI_MODE_NIGHT_YES);
```
4. **动态加载资源**:
- 根据`isNightMode`变量,加载对应的Drawable。例如:
```java
if(isNightMode) {
Drawable myIcon = ContextCompat.getDrawable(this, R.drawable.dark_day_icon);
} else {
Drawable myIcon = ContextCompat.getDrawable(this, R.drawable.day_icon);
}
Button myButton = findViewById(R.id.my_button);
myButton.setBackground(myIcon);
```
5. **响应系统设置改变**:
- 可以注册`OnSharedPreferenceChangeListener`监听`settings.System.NIGHT_MODE`偏好设置的改变,并相应更新UI。