Java 安卓从fragment设置全屏

Java 安卓从fragment设置全屏,java,android,Java,Android,这是我的问题:我有一个android应用程序,它允许用户全屏显示,以提高可读性。全屏晶圆厂切换按钮放在一个片段内,该片段实际上包含读数 简单地说: 主要活动包含阅读片段 阅读片段包含一个用于切换全屏的fab按钮 要触发全屏显示,我使用以下代码段: this.fullScreenFab.setOnClickListener(v -> { WindowManager.LayoutParams attrs = getActivity().getWindow().getAttribut

这是我的问题:我有一个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 one占据了顶部和底部,因此该片段并不是真正的全屏

片段具有

android:fitsSystemWindows="true"
请帮忙! 提前谢谢。
Valerio

您应该尝试使用此标志,因为它旨在删除状态栏和导航

getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
注意:切换或关闭片段时,您需要手动清除此项。否则,此全屏将一直适用,直到父活动存在。为此,

getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

此外,您还可以全屏使用
FLAG\u
。使用它将有效地设置一个透明的通知栏,但状态栏上的图标仍将显示。

Kotlin

onViewCreated()
中使片段全屏显示

requireActivity().window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
requireActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
onDetach()
中清除全屏标志,这样它就不会影响活动中打开的其他片段

requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
requireActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
--x--x--x--x--x--x--x--x--x--

Java

onViewCreated()
中使片段全屏显示

requireActivity().window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
requireActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
onDetach()
中清除全屏标志,这样它就不会影响活动中打开的其他片段

requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
requireActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

在你的飞溅碎片。它也适用于导航

在科特林

 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)
}

系统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)
    }
}

此常量在API级别30中被弃用

WindowManager.LayoutParams.FLAG_FULLSCREEN
使用WindowInsetController#隐藏(int)键入状态栏()

您可以在这里查看android文档
getActivity()。getWindow().setFlags(WindowManager.LayoutParams.FLAG_全屏,WindowManager.LayoutParams.FLAG_全屏)试试这个谢谢,你的代码片段成功了。使用.clearFlags,我可以恢复到原始设置。我很高兴能提供帮助!当我们在代码中添加这一行时,只需将一些设置从移动设置清除为默认设置,如显示关闭重置为出厂重置