You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Splash Screen API中能否添加进度条?

单Activity架构下基于Splash Screen API添加加载进度条完全可行

完全可以实现,核心思路是利用Splash Screen API支持自定义视图的特性,在启动页视图中嵌入进度条,配合数据加载逻辑控制启动页的显示时长。具体实现步骤如下:

  • 配置Splash Screen主题
    在res/values/styles.xml中定义启动页主题,指定背景、图标等基础样式,确保后续能嵌入自定义视图:

    <style name="Theme.App.SplashScreen" parent="Theme.SplashScreen">
        <item name="windowSplashScreenBackground">@color/splash_background</item>
        <item name="windowSplashScreenAnimatedIcon">@drawable/ic_splash_icon</item>
        <item name="postSplashScreenTheme">@style/Theme.App</item>
    </style>
    

    同时在AndroidManifest.xml中将MainActivity的主题设置为该Splash主题。

  • 在Activity中嵌入进度条并控制加载流程
    在单Activity的onCreate方法中,先初始化Splash Screen,再获取其视图容器添加进度条,最后绑定数据加载逻辑:

    class MainActivity : AppCompatActivity() {
        private lateinit var splashScreen: SplashScreen
        private lateinit var loadingProgress: ProgressBar
    
        override fun onCreate(savedInstanceState: Bundle?) {
            // 初始化Splash Screen(必须在super.onCreate之前调用)
            splashScreen = installSplashScreen()
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            // 创建进度条并设置样式
            loadingProgress = ProgressBar(this).apply {
                layoutParams = ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT
                )
                isIndeterminate = true
                setColorFilter(ContextCompat.getColor(context, R.color.progress_color))
            }
    
            // 将进度条添加到Splash Screen的内容容器中
            splashScreen.view?.let { splashView ->
                val contentContainer = splashView.findViewById<ViewGroup>(android.R.id.content)
                contentContainer.addView(loadingProgress)
                // 调整进度条位置,使其居中显示
                (loadingProgress.layoutParams as ViewGroup.MarginLayoutParams).apply {
                    topMargin = resources.getDimensionPixelSize(R.dimen.progress_top_margin)
                }
            }
    
            // 启动后台线程加载服务器数据
            loadServerData()
        }
    
        private fun loadServerData() {
            // 实际场景用Retrofit/OkHttp发起网络请求,这里用延迟模拟加载过程
            lifecycleScope.launch(Dispatchers.IO) {
                delay(3000)
                // 数据加载完成后回到主线程,关闭Splash Screen并切换到主内容Fragment
                withContext(Dispatchers.Main) {
                    splashScreen.setKeepOnScreenCondition { false }
                    supportFragmentManager.beginTransaction()
                        .replace(R.id.fragment_container, HomeFragment())
                        .commit()
                }
            }
        }
    }
    
  • 关键注意点

    • 必须在super.onCreate(savedInstanceState)之前调用installSplashScreen(),否则Splash Screen初始化会失效
    • 数据加载逻辑一定要放在后台线程,避免阻塞主线程引发ANR
    • 用setKeepOnScreenCondition控制启动页的显示时长,返回false时启动页会自动消失
    • 进度条的样式要和启动页整体风格统一,避免视觉违和感

内容的提问来源于stack exchange,提问作者anastasya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:52:39