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

如何仅让Splash Fragment半透明?单Activity架构+Navigation组件问题

解决单Activity+Navigation架构下仅Splash Fragment半透明的问题

方法1:为Splash Fragment单独动态切换主题

  • 在res/values/styles.xml中创建仅包含半透明属性的专属主题:
<style name="SplashTransparentTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
</style>
  • 在Splash Fragment中,进入时切换主题,销毁时恢复原主题:
private var originalTheme = 0

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // 保存Activity原主题
    originalTheme = requireActivity().themeResId
    // 应用透明主题
    requireActivity().setTheme(R.style.SplashTransparentTheme)
    // 强制窗口重绘生效
    requireActivity().window.decorView.post {
        requireActivity().window.setFlags(
            WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
            WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
        )
    }
}

override fun onDestroyView() {
    super.onDestroyView()
    // 恢复原主题
    requireActivity().setTheme(originalTheme)
    // 清除透明标记
    requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}

方法2:直接控制Splash Fragment布局的透明度与窗口适配

  • 不给Activity修改全局主题,仅在Splash Fragment的根布局设置半透明背景,并开启fitsSystemWindows:
<!-- Splash Fragment根布局 -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#80000000" <!-- 半透明黑色背景,可自行调整透明度 -->
    android:fitsSystemWindows="true">

    <!-- 你的Splash页面内容 -->
</LinearLayout>
  • 手动处理系统窗口Insets,避免布局被状态栏遮挡:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets ->
        val params = v.layoutParams as ViewGroup.MarginLayoutParams
        params.topMargin = insets.systemWindowInsetTop
        insets
    }
}

方法3:利用Navigation页面切换回调动态调整窗口属性

  • 在宿主Activity中监听Navigation的页面切换事件,根据当前页面是否为Splash来修改窗口属性:
navController.addOnDestinationChangedListener { _, destination, _ ->
    if (destination.id == R.id.splashFragment) {
        // 设置窗口为透明状态
        window.setFlags(
            WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
            WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
        )
        window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    } else {
        // 恢复窗口默认状态
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        window.setBackgroundDrawable(ColorDrawable(Color.WHITE)) // 替换为你的App默认背景色
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:27:11