package com.sw.inbound.base import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat /** * 所有 Activity 的基类 * - 继承 ComponentActivity,保持与项目其他 Activity 一致 * - 自动隐藏状态栏和导航栏,实现全屏沉浸式体验 * - 在屏幕底部上滑时可临时唤出导航栏,松手后自动收回 */ abstract class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) hideSystemBars() } /** * 窗口焦点变化时回调 * 场景:弹出 Dialog 后焦点丢失,Dialog 消失后焦点恢复,此时需重新隐藏系统栏, * 避免系统栏在 Dialog 关闭后意外"复活" */ override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (hasFocus) { hideSystemBars() } } /** * 隐藏状态栏和导航栏 * 使用 WindowInsetsControllerCompat(Androidx 推荐方式,向下兼容性好) * - 状态栏:完全隐藏 * - 导航栏:完全隐藏,底部上滑时临时出现,松手后自动收回(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) */ private fun hideSystemBars() { // 允许布局延伸到系统栏区域(edge-to-edge),避免内容被系统栏遮挡 WindowCompat.setDecorFitsSystemWindows(window, false) WindowInsetsControllerCompat(window, window.decorView).apply { // 同时隐藏状态栏和导航栏 hide(WindowInsetsCompat.Type.systemBars()) // 底部上滑时临时显示导航栏,松手后自动隐藏(沉浸式 Sticky 模式) systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE } } }