将状态栏设置为渐变drawable且适配启动页的最优方案是什么?
最优实现方案
1. 解决SplashActivity不生效问题
Splash页逻辑不生效的核心原因是:应用冷启动时系统会优先加载主题背景作为启动预览窗,此时Activity的onCreate还未执行,代码配置赶不上启动预览阶段。
直接通过主题配置适配即可:
首先在res/values/themes.xml中定义Splash页专属主题:
<style name="Theme.SplashLauncher" parent="你的应用基础主题"> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item> <!-- 启动预览阶段直接加载渐变背景,避免闪白 --> <item name="android:windowBackground">@drawable/background_color</item> <!-- 适配挖孔屏可额外加这行,让背景延伸到挖孔区域 --> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> </style>
然后在AndroidManifest.xml中给SplashActivity绑定该主题:
<activity android:name=".SplashActivity" android:theme="@style/Theme.SplashLauncher"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
2. 解决多页面复用问题
两种可选方案,可根据项目架构选择:
方案A:Kotlin扩展函数(无侵入,适合混合架构项目)
封装顶层扩展函数,放在通用工具文件中即可:
// StatusBarExt.kt fun Activity.setGradientStatusBar() { window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) window.statusBarColor = ContextCompat.getColor(applicationContext, android.R.color.transparent) window.setBackgroundDrawable(ResourcesCompat.getDrawable(resources, R.drawable.background_color, null)) } // 补充Fragment可用的扩展 fun Fragment.setGradientStatusBar() { activity?.takeIf { !it.isFinishing }?.setGradientStatusBar() }
之后需要生效的页面只需要一行调用:
- Activity的
onCreate中加setGradientStatusBar() - Fragment的
onViewCreated中加setGradientStatusBar()
方案B:基类封装(适合所有页面继承统一基类的项目)
如果项目有统一的BaseActivity、BaseFragment,直接把逻辑写到基类中,还可以加开关灵活控制:
open class BaseActivity : AppCompatActivity() { // 子类可重写该变量关闭当前页面的渐变状态栏 open val enableGradientStatusBar = true override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (enableGradientStatusBar) setGradientStatusBar() } }
内容的提问来源于stack exchange,提问作者Tom Darious
相关产品推荐
相关产品推荐

