前言

在项目中有些需要监听SystemUI状态栏)的显示和影藏。

比如视频全屏和非全屏时,需要做一些布局的动态显示,虽然我们可以控制,但还是存在偶尔状态的失控,导致布局显示不对问题。

以下内容参考《笔记3 | 通过onWindowAttributesChangedonSystemUiVisibilityChange监听状态栏页面的隐藏与显示、动态显示与隐藏状态栏》

  • onWindowAttributesChanged()监听
  • onSystemUiVisibilityChange()监听

onWindowAttributesChanged()监听

在Activity中实现onWindowAttributesChanged()的重写,如下

    @Override
    public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
        super.onWindowAttributesChanged(params);
        Log.d(TAG, "onWindowAttributesChanged flags : " + (getWindow().getAttributes().flags));
    }

下面运行App时的状态变化

# 运行app时的变化
MainActivity( 9159): onWindowAttributesChanged flags : 0
MainActivity( 9159): onWindowAttributesChanged flags : 65792
MainActivity( 9159): onWindowAttributesChanged flags : 8454400
MainActivity( 9159): onWindowAttributesChanged flags : 8454400
MainActivity( 9159): onWindowAttributesChanged flags : 8454400

这个值不稳定,同时我切换了全屏和非全屏,没有值回调。

小结一下,onWindowAttributesChanged()不适合作为状态栏显示和影藏的监听。

onSystemUiVisibilityChange()监听

onSystemUiVisibilityChange()的监听需要设置布局的监听。

    //main_all_layout是根布局的id,这个也可以是其他的id
    findViewById(R.id.main_all_layout).setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {
            Log.d(TAG, "onSystemUiVisibilityChange visibility : "+ visibility);
            if (visibility == (View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)) {
                Log.d(TAG, "onSystemUiVisibilityChange FULLSCREEN: ");
            } else {
                Log.d(TAG, "onSystemUiVisibilityChange NOT FULLSCREEN: ");
            }
        }
    });

上面的View.SYSTEM_UI_FLAG_FULLSCREEN 、 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION都是我这边设置全屏时带的参数。

小结一下,经过多次的测试,这个方法符合我们需求:监听状态栏的影藏和显示。

参考文章

  1. 笔记3 | 通过onWindowAttributesChanged和onSystemUiVisibilityChange监听状态栏页面的隐藏与显示、动态显示与隐藏状态栏

相关文章

暂无评论

  • 笔友城堡
    笔友城堡 管理员

    实际测试中,如果下拉出状态栏,上面的监听还是有问题的。

    广东深圳市
    回复