Android 多窗口支持:检测状态栏是不是可见?

Posted

技术标签:

【中文标题】Android 多窗口支持:检测状态栏是不是可见?【英文标题】:Android Multi-Window Support : Detecting if status bar is visible?Android 多窗口支持:检测状态栏是否可见? 【发布时间】:2016-12-29 13:47:16 【问题描述】:

借助 android 的多窗口支持,我如何检测状态栏是否可见?例如,在纵向时,如果我是顶部应用程序,状态栏可能可见,但当我是底部应用程序时,状态栏将不可见。现在,我的视图在底部时很有趣,因为我为不再存在的状态栏腾出了空间。

【问题讨论】:

不要以编程方式为状态栏腾出空间。使用 android:fitsSystemWindows , View.onApplyWindowInsets(), View.setOnApplyWindowInsetsListener(), Behavior.onApplyWindowInsets() ... 。这是一项艰巨的工作,但您不能依赖状态栏,我们在 N 之前就知道。我建议您花时间使用 WindowInsets 重新实现所有内容。 WindowInsets 以编程方式提供信息,但速度很慢。在找出真正的插图是什么之前,您会接到多个电话。 至于重新实现,我不想。我依赖于许多视图和一些库。它们并不都适合系统窗口。在所有制造商中重新实施和测试 Jelly Bean、KitKat 和 Marshmallow 是最后的手段。 是的,您将接到多个电话。这也是获得插图的唯一可靠方法。您认为 NavigationView 或 DrawerLayout 等支持库中的小部件如何处理它?没错,window insets listener(或者更确切地说是它的兼容对应物)。 I don’t want to - 我也不想要。但是这样我就可以优雅地更新到 N 了。这些建议必须遵循,否则您迟早会发现您的应用程序由于新的 API、新的制造商、具有不可预测插入的新设备而变得一团糟。 【参考方案1】:

假设你的意思是系统UI栏,即状态栏这样做:

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. 
     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. 
     
 

);

这直接来自文档: https://developer.android.com/training/system-ui/visibility.html

【讨论】:

你在多窗口环境下测试过这个吗?对我来说似乎断章取义。我看不出这如何帮助 OP 确定他们需要抵消多少内容。 嗯,它的正确形式是谷歌文档。事实上谷歌已经对它进行了测试 在多窗口模式下系统 ui 可见性不会改变。无论是全屏还是多窗口模式,我都会得到相同的响应。 @FredGrott Ahem,至少从 KitKat 开始,该帖子就一直存在,并且代码完全符合其外观:报告全屏布局。它没有提供任何关于 system insets 的信息,这是 OP 所要求的。

以上是关于Android 多窗口支持:检测状态栏是不是可见?的主要内容,如果未能解决你的问题,请参考以下文章

calabash-android:与状态栏交互

如何实现Android沉浸式状态栏

Android多窗口编程--Android启动多窗口以及生命周期的注意事项

h5手机APP怎么设计沉浸式状态栏

iOS9:自定义 UIWindow 使状态栏消失

Android SeekBar 隐藏在横向屏幕中