点击后隐藏导航栏、状态栏和工具栏

4
我想知道如何在用户点击屏幕时隐藏Android中的状态栏导航栏工具栏,就像QuickPick应用程序中所看到的那样:

enter image description here

我进行了大量的研究,但我找不到或猜测如何实现这种行为,有人能解释一下如何做吗?

1
这可能会有所帮助... http://developer.android.com/intl/zh-cn/training/system-ui/immersive.html - kimchibooty
谢谢,我可以隐藏状态栏导航栏,但无法隐藏工具栏。此外,如果我正在使用https://github.com/chrisbanes/PhotoView,它也无法正常工作,因为填充整个屏幕的图像还具有该库的`onClick()`检测,以便进行缩放。 - Grender
对于工具栏,你可以在包含该视图的活动中调用getActionBar().hide()。很抱歉如果我没有帮上忙!祝你好运! - kimchibooty
@Grender 你好,你最终找到了一个简洁的方法来做它吗? - Suleyman
@LieForBananas 我终于成功解决了,问题是setFitsSystemWindows(true)会添加填充(顶部->状态栏/底部->导航栏),而当你使用setFitsSystemWindows(false)时,它不会移除它所添加的填充,你必须通过编程自己移除填充。 setPadding(0, 0, 0, 0)。我希望它能像解决我的问题一样解决你的问题。 - Jack
显示剩余3条评论
1个回答

2
这是我的解决方案:
button.setOnClickListener(new View.OnClickListener() {

        boolean show = true;

        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "CLICK", Toast.LENGTH_SHORT).show();
            if (show) {
                toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();
                hideSystemUI();
                show = false;
            } else {
                toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start();
                showSystemUI();
                show = true;
            }
        }
    });

private void hideSystemUI() {
    // Set the IMMERSIVE flag.
    // Set the content to appear under the system bars so that the content
    // doesn't resize when the system bars hide and show.
    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                    | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                    | View.SYSTEM_UI_FLAG_IMMERSIVE);

}

private void showSystemUI() {
    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);


}

<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/rootView"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#000"
 android:fitsSystemWindows="true"
 tools:context=".MainActivity">
 .....................

不要忘记在主视图中将fitsSystemWindows设置为true。

你点击了哪个按钮? - Peter Walter
任何你想要的按钮。这只是一个演示。 - kelvincer
@kelvincer,非常好的回答,但问题在于,当导航栏被隐藏时,它会留下一个空白的空间,而我的活动无法重新布局并扩展以填满屏幕。附言:我需要保持fitsSystemWindows为true。我还尝试了删除View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION来强制调整大小,但没有效果。 - Jack
我也尝试在根视图上调用invalidate和requestLayout(),但仍然存在空白的地方。 - Jack
编辑:根布局(RelativeLayout)扩展到填充屏幕。但是,设置了layout_alignParentBottom="true"的子视图仍然没有停留在其位置,并且没有向下移动到其父底部,这导致了间隙。如何解决这个问题? - Jack
@Jack,你修好了吗?我也遇到了同样的问题。导航栏和状态栏的文本是不可见的,但它们没有从原位移除。 - Dibas Dauliya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接