深色主题 android 应用
Dark theme android app
我正在尝试创建一个类似于 OnePlus 设备上 OxygenOS 中的深色主题。
我将 window 背景更改为黑色,但问题是操作栏没有变成纯黑色。
<style name="DarkTheme" parent="Theme.AppCompact">
<item name="android:colorPrimary">@color/black</item>
<item name="android:colorPrimaryDark">@color/black</item>
<item name="android:textColorPrimary">@color/white</item>
<item name="android:colorAccent">@color/white</item>
<item name="android:color">@color/white</item>
<item name="android:windowBackground">@color/black</item>
<item name="android:navigationBarColor">@color/black</item>
<item name="android:actionBarStyle">@color/black</item>
</style>
将这些值替换为 colors.xml
<color name="colorPrimary">#101010</color>
<color name="colorPrimaryDark">#000000</color>
这足以更改工具栏的颜色。
如果您不想更改整个应用程序的原色(这似乎是您最初尝试做的),请尝试通过以下方式创建一个新的工具栏:
将此添加到您应用的 build.gradle
compile 'com.android.support:design:23.1.1'
将此添加到您的主布局 (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="mx.evin.apps.startingtemplate.MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/a_main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@android:color/black"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
在您的样式中设置它 (styles.xml):
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
并设置新工具栏(MainActivity.java)。
Toolbar toolbar = (Toolbar) findViewById(R.id.a_main_toolbar);
setSupportActionBar(toolbar);
借助 Material 组件,我们可以使用两个值文件夹,即 values(对于浅色主题)和 values-night(对于深色主题),或者也可以使用以下样式管理 dayNight
主题:
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
对于深色操作栏,主题父级应该是:
parent="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
要设置深色主题,我们可以使用 AppCompatDelegate 的这个方法
setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_YES);
More 关于不同 API 水平如何运作的详细信息。
最简单的解决方案
您可以 enable/disable 深色主题,只需:
启用深色主题:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
强制禁用深色主题:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
根据移动设备设置的深色模式设置应用主题,即如果启用了深色模式,则主题将设置为深色主题,否则将设置为深色主题
默认主题,但这只适用于 version >= Android version Q
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
备注:
- 您 app/activity 的基本主题应该是
"Theme.AppCompat.DayNight"
喜欢
<style name="DarkTheme" parent="Theme.AppCompat.DayNight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
- 您的 res 文件夹的名称将以 -night 结尾,这样您就可以为日夜主题设置不同的颜色和图像,例如
drawable & drawable-night,
价值与价值之夜
由于
,今天实现深色主题(或黑色主题)非常容易
Theme.DayNight and
AppCompatDelegate
Android 来找我们允许我们声明
night/colors.xml
和
night/styles.xml
完整示例在这里:https://github.com/android/user-interface-samples/tree/master/DarkTheme
为了支持 Dark Theme,您需要做的第一件事就是确保您的主题继承自 DayNight 主题。
完成后,主题应如下所示:
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
本质上,DayNight 主题与两个目录一起工作 - values 目录中的 Light 主题和 values-night 目录中的 Dark 主题。
因此,无论何时您要根据主题使用不同的资源值,您都需要在上述两个目录中声明该资源。
例如,您可以像这样创建两种不同的颜色资源:
values/colors.xml
<color name="colorPrimary">#f2f2f2</color>
<color name="colorPrimaryDark">#000000</color>
<color name="colorAccent">#29b6f6</color>
values-night/colors.xml
<color name="colorPrimary">#2e2f32</color>
<color name="colorPrimaryDark">#121212</color>
<color name="colorAccent">#90caf9</color>
应该是这样,你可以在我的博客上阅读更详细的内容
https://androidexplained.github.io/ui/android/material-design/2020/09/24/dark-mode.html
没有人提到这个作为另一个暗示黑暗 = 夜晚的答案。不! Dark Mode
不是 Night Mode
。他们是完全不同的。 DM 是在 Android 10 中引入的,它强制执行内置的黑白颜色,因此它可以通过设备设置进行更改,而 NM 已经存在于使用 default/defined 样式的早期版本中,具体取决于您的实现,并且通常可以在应用程序设置中进行更改。如果您希望您的应用使用您定义的 light/night 样式而不依赖于内置的深色样式,您可能希望 forceDarkAllowed
在 themes.xml 或 style.xml 中设置为 false as DM可能会冲突。
我正在尝试创建一个类似于 OnePlus 设备上 OxygenOS 中的深色主题。
我将 window 背景更改为黑色,但问题是操作栏没有变成纯黑色。
<style name="DarkTheme" parent="Theme.AppCompact">
<item name="android:colorPrimary">@color/black</item>
<item name="android:colorPrimaryDark">@color/black</item>
<item name="android:textColorPrimary">@color/white</item>
<item name="android:colorAccent">@color/white</item>
<item name="android:color">@color/white</item>
<item name="android:windowBackground">@color/black</item>
<item name="android:navigationBarColor">@color/black</item>
<item name="android:actionBarStyle">@color/black</item>
</style>
将这些值替换为 colors.xml
<color name="colorPrimary">#101010</color>
<color name="colorPrimaryDark">#000000</color>
这足以更改工具栏的颜色。
如果您不想更改整个应用程序的原色(这似乎是您最初尝试做的),请尝试通过以下方式创建一个新的工具栏:
将此添加到您应用的 build.gradle
compile 'com.android.support:design:23.1.1'
将此添加到您的主布局 (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="mx.evin.apps.startingtemplate.MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/a_main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@android:color/black"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
在您的样式中设置它 (styles.xml):
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
并设置新工具栏(MainActivity.java)。
Toolbar toolbar = (Toolbar) findViewById(R.id.a_main_toolbar);
setSupportActionBar(toolbar);
借助 Material 组件,我们可以使用两个值文件夹,即 values(对于浅色主题)和 values-night(对于深色主题),或者也可以使用以下样式管理 dayNight
主题:
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
对于深色操作栏,主题父级应该是:
parent="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
要设置深色主题,我们可以使用 AppCompatDelegate 的这个方法
setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_YES);
More 关于不同 API 水平如何运作的详细信息。
最简单的解决方案
您可以 enable/disable 深色主题,只需:
启用深色主题:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
强制禁用深色主题:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
根据移动设备设置的深色模式设置应用主题,即如果启用了深色模式,则主题将设置为深色主题,否则将设置为深色主题 默认主题,但这只适用于 version >= Android version Q
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
备注:
- 您 app/activity 的基本主题应该是
"Theme.AppCompat.DayNight"
喜欢
<style name="DarkTheme" parent="Theme.AppCompat.DayNight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
- 您的 res 文件夹的名称将以 -night 结尾,这样您就可以为日夜主题设置不同的颜色和图像,例如
drawable & drawable-night,
价值与价值之夜
由于
,今天实现深色主题(或黑色主题)非常容易Theme.DayNight and AppCompatDelegate
Android 来找我们允许我们声明
night/colors.xml
和
night/styles.xml
完整示例在这里:https://github.com/android/user-interface-samples/tree/master/DarkTheme
为了支持 Dark Theme,您需要做的第一件事就是确保您的主题继承自 DayNight 主题。
完成后,主题应如下所示:
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
本质上,DayNight 主题与两个目录一起工作 - values 目录中的 Light 主题和 values-night 目录中的 Dark 主题。
因此,无论何时您要根据主题使用不同的资源值,您都需要在上述两个目录中声明该资源。
例如,您可以像这样创建两种不同的颜色资源:
values/colors.xml
<color name="colorPrimary">#f2f2f2</color>
<color name="colorPrimaryDark">#000000</color>
<color name="colorAccent">#29b6f6</color>
values-night/colors.xml
<color name="colorPrimary">#2e2f32</color>
<color name="colorPrimaryDark">#121212</color>
<color name="colorAccent">#90caf9</color>
应该是这样,你可以在我的博客上阅读更详细的内容
https://androidexplained.github.io/ui/android/material-design/2020/09/24/dark-mode.html
没有人提到这个作为另一个暗示黑暗 = 夜晚的答案。不! Dark Mode
不是 Night Mode
。他们是完全不同的。 DM 是在 Android 10 中引入的,它强制执行内置的黑白颜色,因此它可以通过设备设置进行更改,而 NM 已经存在于使用 default/defined 样式的早期版本中,具体取决于您的实现,并且通常可以在应用程序设置中进行更改。如果您希望您的应用使用您定义的 light/night 样式而不依赖于内置的深色样式,您可能希望 forceDarkAllowed
在 themes.xml 或 style.xml 中设置为 false as DM可能会冲突。