这是我的问题:我有一个Android应用程序,允许用户全屏显示以获得更好的可读性。全屏fab切换按钮放在一个实际包含读数的片段内。
让它变得简单:
要触发全屏我使用此代码段:
this.fullScreenFab.setOnClickListener(v -> {
WindowManager.LayoutParams attrs = getActivity().getWindow().getAttributes();
if (this.isFullScreen) {
this.isFullScreen = false;
((AppCompatActivity)
getActivity()).getSupportActionBar().show();
getActivity().getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
} else {
this.isFullScreen = true;
((AppCompatActivity) getActivity()).getSupportActionBar().hide();
getActivity().getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
getActivity().getWindow().setAttributes(attrs);
});
现在,除了状态栏和操作栏空间不断显示外,它运行良好。活动是FS(甚至Android都警告我),但这两个元素占用的空间仍然存在。
正如您所看到的,FS的顶部和底部都被占用,因此片段不会用于真正的全屏。
片段有
android:fitsSystemWindows="true"
请发送帮助! 提前致谢。 瓦莱里奥
答案 0 :(得分:7)
您应尝试使用此标记,因为它旨在删除状态栏和导航。
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
注意:您需要在切换或关闭片段时手动清除它。否则,此全屏将适用,直到父活动存在。为此,
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
此外,您可以使用FLAG_FULLSCREEN
。使用它将有效地设置透明通知栏,但状态栏上的图标仍会显示。
答案 1 :(得分:4)
科特林
在onViewCreated()
中使片段全屏显示
requireActivity().window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
在onDetach()
中清除全屏标志,以免影响在“活动”中打开的其他片段
requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
-x--x--x--x--x--x--x--x--x-
Java
在onViewCreated()
中使片段全屏显示
requireActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
在onDetach()
中清除全屏标志,以免影响在“活动”中打开的其他片段
requireActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
答案 2 :(得分:1)
在您的飞溅片段中。它也适用于导航
科特林
override fun onAttach(context: Context) {
super.onAttach(context)
requireActivity().window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
}
override fun onDetach() {
super.onDetach()
requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
}
答案 3 :(得分:1)
系统 UI 全屏标志现已弃用,API 级别 30 及更高级别覆盖 onWindowFocusChanged()
MainActivity
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus) hideSystemUI() else showSystemUI()
}
private fun hideSystemUI() {
if (Build.VERSION.SDK_INT >= 30) {
window.insetsController?.apply {
hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars())
}
} else {
// Enables regular immersive mode.
// For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
// Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE
// Set the content to appear under the system bars so that the
// content doesn't resize when the system bars hide and show.
or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// Hide the nav bar and status bar
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_FULLSCREEN)
}
}
private fun showSystemUI() {
if (Build.VERSION.SDK_INT >= 30) {
window.insetsController?.apply {
show(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars())
}
} else {
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
}
}
答案 4 :(得分:1)
此常量在 API 级别 30 中已弃用。
TelephonyManager
使用 WindowInsetsController#hide(int) 和 Type#statusBars() 代替。 See this link