Android从片段

时间:2018-03-23 09:57:08

标签: java android

这是我的问题:我有一个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都警告我),但这两个元素占用的空间仍然存在。

禁用全屏 Full screen disabled

全屏启用 Full screen enabled

正如您所看到的,FS的顶部和底部都被占用,因此片段不会用于真正的全屏。

片段有

android:fitsSystemWindows="true"

请发送帮助! 提前致谢。 瓦莱里奥

5 个答案:

答案 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