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