App夜间模式简单实现

本文介绍了两种在Android App中实现夜间模式的方法。第一种是通过添加遮罩层,简单快速,避免页面闪烁。第二种是利用自定义属性,虽然处理更复杂,但能实现更多颜色变化,需要处理页面重绘导致的闪烁问题。建议在切换后返回主Activity来减少闪烁现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般资讯类的app都会有夜间模式,方便用户夜晚使用,今天就来说说夜间模式的简单实现。

第一种:简单,方便,不会有页面闪烁。

最简单的方法就是在布局的外层再加一层遮罩,这个遮罩就好比是墨镜,日间模式下遮罩隐藏,当设置夜间模式的时候遮罩显示,就好比用户带了墨镜之后使用app。这种方法是最简单方便的,同时设置之后页面不会闪烁。

第二种:使用自定义属性,需要处理页面闪烁

可能第一种方法局限性比较大,有的夜间模式文字颜色和背景不仅仅只是加遮罩这么简单,可能需要有对比反差,那就用第二种方法:自定义属性

第一步:我们现在attrs里自定义自己需要切换的颜色属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="home_item_text_color" format="color|reference"/>
    <attr name="home_bg" format="color|reference"/>
    <attr name="home_item_bg" format="color|reference"/>
</resources>
第二步:在style里自定义Activity的Theme

<style name="DayTheme" parent="Theme.Activity.Common">
        <item name="home_item_text_color">@color/txt_main</item>
        <item name="home_bg">@color/bg_pressed</item>
        <item name="home_item_bg">@color/white</item>
    </style>

    <style name="NightTheme" parent="Theme.Activity.Common">
        <item name="home_item_text_color">@color/white</item>
        <item name="home_bg">@color/night_mode_background</item>
        <item name="home_item_bg">@color/night_mode_item_background</item>
    </style>
定义了两个style,分别为日间模式和夜间模式,然后给同一个属性附上了不同的颜色值

第三步:在布局文件里,涉及到需要切换的控件时,设置颜色的时候使用我们自定义的属性

<View
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:background="?home_bg" />

    <LinearLayout
        android:id="@+id/layout_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:background="?home_item_bg"
        android:paddingBottom="10dp"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:paddingTop="10dp">

我们看到在设置View和LinearLayout的背景颜色时使用了"?XXXX",这就是使用我们自定义属性的色值。

第四步:当切换日间和夜间模式的时候,给activity设置Theme。

if (AppRunningContext.isNightMode()) {
                    // 夜间模式
                    setTheme(R.style.NightTheme);
                } else {
                   // 日间模式
                    setTheme(R.style.DayTheme);
                }

这就是用自定义属性来切换日间和夜间模式的步骤。

不过有的人会说为啥设置完成之后没有看到效果呢?那是因为设置完需要重绘activity或者fragment,这样就会造成页面闪烁。那有啥解决的好方法呢?

我提供一种方法:设置界面是一个单独的activity,这个页面没有日间和夜间的区别,在这里点击切换,然后返回到显示的activity就可以了。



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值