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

相关推荐
x***13395 小时前
【MyBatisPlus】MyBatisPlus介绍与使用
android·前端·后端
n***54386 小时前
【MySQL】MySQL内置函数--日期函数字符串函数数学函数其他相关函数
android·mysql·adb
z***75157 小时前
【Springboot3+vue3】从零到一搭建Springboot3+vue3前后端分离项目之后端环境搭建
android·前端·后端
程序员陆业聪7 小时前
Android模拟器检测全面指南:从基础到高级策略
android
2501_916008899 小时前
iOS 性能测试的深度实战方法 构建从底层指标到真实场景回放的多工具测试体系
android·ios·小程序·https·uni-app·iphone·webview
w***95499 小时前
SQL美化器:sql-beautify安装与配置完全指南
android·前端·后端
r***123810 小时前
若依微服务中配置 MySQL + DM 多数据源
android·mysql·微服务
ALex_zry10 小时前
MySQL连接数管理与优化实操经验分享
android·mysql·adb
apigfly12 小时前
深入Android系统(十三)Android的窗口系统
android·设计模式·源码
k***858412 小时前
【SpringBoot】【log】 自定义logback日志配置
android·前端·后端