Nexus5 实现全屏显示(屏幕状态监听)(code)

来源:互联网 发布:单片机波特率宏定义 编辑:程序博客网 时间:2024/06/15 16:27

最近开发的时候发现,nexus5在全屏显示方面有一个不好处理的地方

nexus5没有实体按键,所以在屏幕显示区域 有一个 NavigationBar 存在,也就是Android机型最经典的三个按键。

如果要实现Activity的全屏显示,有以下几个方案。

方案一

在Androidmanifast文件中 对activity的属性进行修改

android:theme="@android:style/Theme.NoTitleBar.Fullscreen

也可以在代码中实现

        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

效果如图

这里写图片描述

虽然实现了全屏,系统状态栏消失了,但是NavigationBar依然存在,并且占据的显示内容的一部分。

方案二

在activity的onCreate方法中 添加如下代码

View mDecorView = getWindow().getDecorView();        mDecorView.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                | View.SYSTEM_UI_FLAG_FULLSCREEN                | View.SYSTEM_UI_FLAG_LOW_PROFILE                | View.SYSTEM_UI_FLAG_IMMERSIVE);

效果如图

这里写图片描述

看上去似乎已经达到了效果,但是在触摸屏幕顶部区域,会触发系统的通知栏,这个时候NavigationBar就会显示出来,并且一直显示。

这里写图片描述

所以这种方法也是不完美的。

On Android 4.1 and higher, you can set your application's content to appear behind the status bar, so that the content doesn't resize as the status bar hides and shows. To do this, help your app maintain a stable layout.

根据官方描述,SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN这个属性可以让NavigationBar显示在内容上方,而不会因为NavigationBar的显示于隐藏,resize 内容区域。SYSTEM_UI_FLAG_LAYOUT_STABLE这个属性是让效果持续的。

方案三

同样是在activity中的oncreate方法中添加如下代码

 getWindow().getDecorView()                .setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

这种方法的效果是可以隐藏NavigationBar,但是一旦用户与屏幕发生交互动作,比如点击屏幕。 NavigationBar就会显示出来。

问题

综上所述,发现最终的问题是,当用户与界面发生交互,会退出全屏模式。(官方给出的解释是,一旦用户触碰屏幕,之前设置的flag会被清空)

With this approach, touching anywhere on the screen causes the navigation bar (and status bar) to reappear and remain visible. The user interaction causes the flags to be be cleared.

解决方案

Responding to UI Visibility Changes

监听状态栏,和导航栏的 显示,和隐藏变化。

通过View.OnSystemUiVisibilityChangeListener这个监听器实现监听。

在你的Activity中的onCreate方法中 添加如下代码。

View decorView = getWindow().getDecorView();decorView.setOnSystemUiVisibilityChangeListener        (new View.OnSystemUiVisibilityChangeListener() {    @Override    public void onSystemUiVisibilityChange(int visibility) {        // Note that system bars will only be "visible" if none of the        // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {            // TODO: The system bars are visible. Make any desired            //现在系统状态栏,导航栏处于显示状态。            // adjustments to your UI, such as showing the action bar or            // other navigational controls.            //在这里重新设置 Decorview的状态为全屏状态,这样就可以在用户点击屏幕退出全屏之后,再次进入全屏。        } else {            // TODO: The system bars are NOT visible. Make any desired            //系统状态栏,导航栏处于 消失 状态            // adjustments to your UI, such as hiding the action bar or            // other navigational controls.        }    }});

reference link 1

reference link 2

reference link 3

0 0