前言
在项目中有些需要监听SystemUI(状态栏)的显示和影藏。
比如视频全屏和非全屏时,需要做一些布局的动态显示,虽然我们可以控制,但还是存在偶尔状态的失控,导致布局显示不对问题。
以下内容参考《笔记3 | 通过onWindowAttributesChanged和onSystemUiVisibilityChange监听状态栏页面的隐藏与显示、动态显示与隐藏状态栏》
- 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都是我这边设置全屏时带的参数。
小结一下,经过多次的测试,这个方法符合我们需求:监听状态栏的影藏和显示。
参考文章
© 版权声明
实际测试中,如果下拉出状态栏,上面的监听还是有问题的。