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

相关推荐
_李小白21 小时前
【Android GLSurfaceView源码学习】第二天:GLSurfaceView深度分析
android·学习
元气满满-樱1 天前
LNMP架构学习
android·学习·架构
allk551 天前
Android 渲染性能优化实战总结:从监控体系到架构落地
android·性能优化·架构
思成不止于此1 天前
C++红黑树封装map/set核心揭秘
android
走在路上的菜鸟1 天前
Android学Dart学习笔记第十七节 类-成员方法
android·笔记·学习·flutter
歪楼小能手1 天前
Android16底部导航栏添加音量加减虚拟按键
android·java·平板
又是努力搬砖的一年1 天前
elasticsearch修改字段类型
android·大数据·elasticsearch
走在路上的菜鸟1 天前
Android学Dart学习笔记第十八节 类-继承
android·笔记·学习·flutter
Colinnian1 天前
Android Studio创建新项目时需要更改哪些地方
android·ide·android studio
走在路上的菜鸟1 天前
Android学Dart学习笔记第十九节 类-混入Mixins
android·笔记·学习·flutter