黑暗模式上的一些快速笔记
#android #darkmode

黑暗模式,也许是实现的最简单功能之一,而不破坏现有项目中的任何内容。但是,它具有自身的隐藏成本和技巧。在实施黑暗模式之前,最重要的是您的项目必须为黑暗模式做好准备。

我拥有的东西:

我想实现的目标:

设置:

您唯一需要做的才能准备好您的应用程序以进行黑暗模式,这是主题标签和AppCompatdelegate类。其余的取决于您的项目。因此,您只需要<样式名称\ =“ apptheme” parent \ =“ theme.appcompat.daynight”>。暗模式/光模式的代码非常简单:

appcompatdelegate 。 span> appcompatdelegate mode_nign_yes_yes //光模式 appcompatdelegate 。 span> appcompatdelegate mode_night_no_no //询问黑模式是否打开: appcompatdelegate getDefaultnightmode ()< /span> == appcompatdelegate mode_night_yes //询问光模式是否打开: appcompatdelegate getDefaultnightmode ()< /span> == appcompatdelegate mode_night_no

_note:这些不是仅州。 _

我面临的问题:

抽屉:

首先,如果您在光模式下注意到抽屉,您会看到菜单项的文本是黑色的。我真的不想要那个,因为在黑暗模式下它会真正吮吸。由于您无法从XML更改它,因此您可以为此做的事情:

   private   fun    checknavview  ()  {
			 val   colorListItems   =   colorStateList  
			 arrayof   intarrayof  ( -    android   。 /span>  r    attr     state_enabled  ),
			 intarrayof    android  。 span>  r    attr     state_enabled  
			),
			 intarrayof   contextCompat    getColor    this    r   颜色   md_black_1000   ),
			 contextCompat    getColor    this    r  。在>)
			
			
			 val   colorListText   =    colorStateList  
			 arrayof   intarrayof  ( -    android   。 /span>  r    attr     state_enabled  ),
			 intarrayof    android  。 span>  r    attr     state_enabled  
			),
			 intarrayof   contextCompat    getColor    this    r   颜色   md_black_1000   ),
			 contextCompat    getColor    this    r   颜色   md_white_1000  
			
			
			如果   appcompatdelegate  。 span>  getDefaultnightmode  ()  == = =   Mode_night_yes    {
			 nav_view    itemTextColor   =   colorListText 
			 nav_view  。跨度>  colorListItems 
			} 
			} 
			 

**自定义插入颜色:**

问题的这一部分有两个选择。好吧,我的背景颜色或文本颜色具有由XML设定的颜色,而不是由主题设置的。因此,您可以在这里做的是选择不影响主题可见性的颜色,或者离开Android默认。

由于我正在使用单个活动并在活动中进行这些更改(因为抽屉位于那里),因此无需更多地处理片段中的事物(除非必须根据主题替换图标)。<<<<<<<<<<<< /p>

工具栏:

是的。我们应该小心工具栏。一旦实现了深色主题,您可能也不希望工具栏也有黑色文字。因此,您只需将其更改为:

   private   fun    checktoolbar  ()  {
			如果   appcompatdelegate  。 span>  getDefaultnightmode  ()  == = =   Mode_night_yes    {
			工具栏  上下文  。 span>  setTheme    r     style    themoverlay_materialcomponents_dark   
			}  工具栏  上下文  。 span>  setTheme    r     style    themoverlay_materialcomponents_lights_light   
			} 
			} 
			 

savedinstancestate。

我在实施过程中曾经犯的一个错误是,我试图重新创建()活动,以便调用onsavedinstancestate。无需这样做,一旦您调用appcompatdelegate.setDefaultnightnightmode(appcompatdelegate.hatever_mode),活动将为您重新创建活动。重新创建活动后,您可以在您的ongreate方法中检查上面讨论的抽屉或工具栏。

有更好的方法吗?

也许是。您可以尝试从styles.xml上的主题标签中对所有这些编码。但是由于XML不是我的事,所以我选择了这种方法。

希望我有帮助。完整项目 github