安卓应用如何根据昼夜时间切换Drawable背景?
Android昼夜背景切换实现指南(新手友好版)
Hey 👋,作为Android新手想实现这个功能真的很简单,我给你一步步拆解,每段代码都加了注释,跟着做就行!
1. 准备好昼夜背景资源
首先你得在res/drawable目录下准备两张背景(可以是图片或者xml shape),比如命名为:
bg_day.xml(日间背景)bg_night.xml(夜间背景)
不用纠结格式,普通的png/jpg或者自定义shape都能直接用。
2. 写一个判断昼夜的工具方法
我们需要一个方法来判断当前时间属于日间还是夜间,这里我设定晚上20:00到次日6:00为夜间,你可以根据需求随意调整时间阈值。
可以写一个工具类,比如TimeUtils.java:
import java.util.Calendar; public class TimeUtils { // 判断当前是否为夜间 public static boolean isNightTime() { Calendar calendar = Calendar.getInstance(); int currentHour = calendar.get(Calendar.HOUR_OF_DAY); // 获取当前小时(24小时制) // 自定义夜间时间范围:20点到次日6点 return currentHour >= 20 || currentHour < 6; } }
如果用Kotlin的话,代码会更简洁:
import java.util.Calendar object TimeUtils { fun isNightTime(): Boolean { val currentHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY) return currentHour >= 20 || currentHour < 6 } }
3. 在Activity/Fragment中设置背景
接下来在页面初始化时(比如onCreate方法里),调用上面的判断方法,给布局设置对应的背景。
先给页面的根布局加个id,比如activity_main_root:
<!-- activity_main.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main_root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 你的其他控件内容 --> </LinearLayout>
然后在Activity里写逻辑:
Java版本
import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.LinearLayout; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取根布局实例 LinearLayout rootLayout = findViewById(R.id.activity_main_root); // 判断昼夜并切换背景 if (TimeUtils.isNightTime()) { rootLayout.setBackgroundResource(R.drawable.bg_night); } else { rootLayout.setBackgroundResource(R.drawable.bg_day); } } }
Kotlin版本
import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.LinearLayout class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val rootLayout = findViewById<LinearLayout>(R.id.activity_main_root) // 一行代码完成判断与背景设置 rootLayout.setBackgroundResource( if (TimeUtils.isNightTime()) R.drawable.bg_night else R.drawable.bg_day ) } }
4. 进阶优化(可选)
上面的代码只能在页面启动时判断一次,如果用户在使用过程中跨了昼夜时间点(比如从19:59用到20:01),背景不会自动切换。如果需要实时切换,可以:
- 用
BroadcastReceiver监听系统的ACTION_TIME_TICK广播(每分钟触发一次),每次触发时重新判断并设置背景 - 或者用
WorkManager定时检查时间,比如每小时执行一次判断逻辑
不过作为新手,先把基础功能跑通就好,进阶功能可以之后再慢慢研究~
注意事项
- 不需要申请任何权限,获取系统时间是Android默认允许的操作
- 确保根布局的宽高是
match_parent,这样背景才能铺满整个屏幕 - 可以根据自己的需求修改夜间的时间范围,比如改成21:00到5:00
这样就完成啦!如果有哪里看不懂或者跑不起来,随时说~
内容的提问来源于stack exchange,提问作者RedBounce
相关产品推荐
相关产品推荐

