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,有些细节可能还要在实际开发中调整。

相关推荐
DogDaoDao3 小时前
Android 硬件编码器参数完全指南:MediaCodec 深度解析
android·音视频·视频编解码·h264·硬编码·视频直播·mediacodec
JohnnyDeng944 小时前
Android 自定义 View:Canvas 绘图与事件分发深度解析
android
Android小码家7 小时前
Framework之Launcher小窗开发
android·framework·虚拟屏·小窗
赏金术士8 小时前
第七章:状态管理实战与架构总结
android·ui·kotlin·compose
颂love9 小时前
MySQL的执行流程
android·数据库·mysql
云起SAAS13 小时前
抖音小游戏源码 - 消消乐 | 含激励广告+成就系统 | 开箱即用商业级消除游戏模板
android·游戏·广告联盟·看激励广告联盟流量主·抖音小游戏源码 - 消消乐
大貔貅喝啤酒15 小时前
基于Windows下载安装Android Studio 3.3.2版本教程(2026详细图文版)
android·java·windows·android studio
程序员码歌15 小时前
OpenSpec 到 Superpowers:AI 编码从说清到做对
android·前端·人工智能
2501_9151063215 小时前
深入解析无源码iOS加固原理与方案,保护应用安全
android·安全·ios·小程序·uni-app·cocoa·iphone
黄林晴18 小时前
重磅官宣:Android UI 开发正式进入 Compose-first 时代
android·google io