Android 通过Dialog实现全屏

在项目的实际开发中会碰到有些View需要横屏全屏的情况,比如视频播放的View,详情的View等,如果跳转到新的Activity或Fragment来展示横屏全屏,有些进度、状态等携带过去又很麻烦,这样的情况下通过Dialog实现全屏就是一个选择。

一、Dialog的初始化

一般情况下Activity或Fragment需要显示状态栏和导航栏,但是在Dialog全屏的时候是需要全屏的,如果还显示状态栏和导航栏就会有问题,重点在于Dialog的初始化方式。最简单的初始化方式如下:

kotlin 复制代码
private var fullscreenDialog: Dialog? = null

/**
 * 初始化全屏播放的Dialog
 */
private fun initFullScreenDialog() {
    fullscreenDialog = object : Dialog(requireActivity(), android.R.style.Theme_Black_NoTitleBar_Fullscreen) {
        @Deprecated("Deprecated in Java")
        override fun onBackPressed() {
             Log.d(TAG,"close fullscreen")
             toggleFullscreen()
            //super.onBackPressed()
        }

        override fun onCreate(savedInstanceState: Bundle?) {  
            super.onCreate(savedInstanceState)
            //一定要加这部分代码,可以实现全屏
            window?.decorView?.systemUiVisibility = (
                    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                            or View.SYSTEM_UI_FLAG_FULLSCREEN)
        }
    }
}

二、全屏和非全屏的实现

思路其实是将整个需要全屏的View,添加给Dialog即可。

kotlin 复制代码
@SuppressLint("SourceLockedOrientationActivity")
private fun openFullscreenDialog() {
    //旋转为横屏
    requireActivity().requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
    //从父View中移除需要全屏的View
    binding.clContainer.removeView(binding.fullscreenView)
    //将需要全屏的View添加到Dialog
    fullscreenDialog?.addContentView(
        binding.fullscreenView,
        ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT
        )
    )
    isFullscreen = true
    //显示Dialog
    fullscreenDialog?.show()
}


private fun closeFullscreenDialog() {
    //旋转为竖屏
    requireActivity().requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    //(binding.exoPlayerView.parent.parent as ViewGroup).removeAllViews()
    //将View又重新添加回来
    binding.clContainer.addView(binding.fullscreenView)
    isFullscreen = false
    //退出Dialog
    fullscreenDialog?.dismiss()
}

比如在视频播放的View可以非常简单的同步各种加载、失败、错误、进度等状态的UI,有些细节可能还要在实际开发中调整。

相关推荐
提子拌饭1331 小时前
番茄时间管理:鸿蒙Flutter 实现的高效时间管理工具
android·flutter·华为·架构·开源·harmonyos·鸿蒙
4311媒体网2 小时前
帝国CMS二次开发实战:精准实现“最新资讯”标识与高亮判断
android
BLUcoding2 小时前
Android 轻量级本地存储 SharedPreferences
android
冬奇Lab2 小时前
Camera HAL3 接口:Android 相机的真正底牌
android·音视频开发·源码阅读
sensen_kiss2 小时前
CAN302 Technologies for E-Commerce 电子商务技术 Pt.6 市场营销与SEO(搜索引擎优化)
android·学习·搜索引擎
菜鸟国国3 小时前
Compose + Koin ViewModel 实战完全手册
android
小羊子说3 小时前
Android 音频系统深度解析:从 App 到内核的完整链路
android·人工智能·性能优化·车载系统
fengci.3 小时前
php反序列化(复习)(第三章)
android·开发语言·学习·php
D4c-lovetrain3 小时前
linux个人心得24 (mysql③,AI排版尝试)
android·adb
csj504 小时前
安卓基础之《(25)—竖屏与横屏切换》
android