如何仅让Splash Fragment半透明?单Activity架构+Navigation组件问题
方法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
相关产品推荐
相关产品推荐

