繁体   English   中英

实现黑暗主题的正确方法 Android Java

[英]Proper way to Implement Dark Theme Android Java

我正在学习如何在应用程序中实现深色主题。
从中阅读文件,以下是我理解的要求

  1. 确保“样式”父 = <style name="AppTheme" parent="Theme.AppCompat.DayNight">
  2. 在 colors.xml 文件中为深色主题创建一个新的 colors
  3. 如果使用“开关”切换,请使用AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); onCheckedChanged监听器内部

根据测试,调用AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); 将触发recreate()以重新创建活动,结果它将按预期更改主题,也会出现黑色闪烁的东西。

通读,它指出我需要在setContentView(R.layout.activity_main);之前声明setTheme方法。 所以它将解决黑色的东西问题。

Android 开发文档在AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);之后的OnCreate方法中没有提到关于setTheme的任何内容; 用来

  1. 如果只使用AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); 能够切换欲望主题,在onCreate方法中再次使用setTheme有什么意义?
  2. 黑色闪烁的东西是错误吗? 还是有适当的方法来解决它?

我很困惑,花了一个多星期来解决这个问题,非常感谢指导或提示

AppCompactDelegate 有时会重新创建导致黑色闪烁的活动

检查这个它改变了没有黑色闪烁的主题

创建两个主题或使用默认的深色主题 xml,如下所示:

<!--  Dark theme  -->

<style name="DarkTheme" parent="Theme.AppCompat.Light.DarkActionBar">

<item name="colorPrimary">@color/darkColorPrimary</item>
<item name="colorPrimaryDark">@color/darkColorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="fontFamily">@font/roboto</item>
<item name="listBackground">@color/darkListBackground</item>
<item name="cardBackground">@color/darkCardBackground</item>
<item name="textColor">@color/darkCardTitle</item>
<item name="actionBarBackgroundColor">@color/darkColorPrimary</item>
<item name="actionBarTextColor">@color/darkCardTitle</item>
<item name="dialogTextColor">@color/darkDialogTitle</item>
<item name="dialogDateColor">@color/dialogDateColor</item>
</style>


<!--  Light theme  -->

<style name="LightTheme" parent="Theme.AppCompat.Light.DarkActionBar">

<item name="colorPrimary">@color/lightColorPrimary</item>
<item name="colorPrimaryDark">@color/lightColorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="fontFamily">@font/roboto</item>
<item name="listBackground">@color/lightListBackground</item>
<item name="cardBackground">@color/lightCardBackground</item>
<item name="textColor">@color/lightCardTitle</item>
<item name="actionBarBackgroundColor">@color/lightColorPrimary</item>
<item name="dialogTextColor">@color/lightDialogTitle</item>
<item name="dialogDateColor">@color/dialogDateColor</item>
</style>

使用共享偏好保存主题类型

SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("NightMode", false);
        editor.apply();

使用共享偏好在创建方法上更改 Activity 上的 App 主题

 if (!darktheme) {
            setTheme(R.style.DarkTheme);
        } else {
            setTheme(R.style.LightTheme);
        }

有关简要信息,请获取该项目: https://github.com/yeshasmp/ToDo/tree/v1.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM