Android OnApplyWindowInset使用奇怪的顶部插图调用

Android OnApplyWindowInset使用奇怪的顶部插图调用,android,android-layout,windowinsets,Android,Android Layout,Windowinsets,我有一个Android应用程序,其主题中有以下设置: <item name="android:navigationBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowDrawsSystemBarBackgrounds

我有一个Android应用程序,其主题中有以下设置:

<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item>

<item name="android:windowDrawsSystemBarBackgrounds">true</item>
注意:在横向模式下,有两个连续调用onApplyWindowInsets(),此处仅报告最后一个调用

视图实际上并没有超出可见区域的顶部:如果我在视图顶部绘制一个24像素的区域,它将显示在可见区域的顶部(即,如果存在状态栏,则显示在状态栏下方),永远不会离开屏幕

如果我信任这些插入值,并按指示的像素数偏移内容,以使其远离系统栏,那么最终会在视图顶部出现一个间隙

就我所知,左/右/底部的值似乎还可以


我怎样才能纠正这个问题?我忽略了什么吗?

由于我仍然没有解释报告的值,我认为这要么是一个bug,要么是一个缺乏文档记录的特性,尽管如此,在许多(如果不是所有)版本的Android中都存在这一特性

幸运的是,至少在API 23+上,还有另一种获取窗口插入的方法,即调用
View#getWindow().getRootView().getRootWindowInsets()
。这似乎有问题,即报告导航栏的插入错误,但合并这两个结果对我来说很有效

  • 将传递给
    的插图存储在applyWindowsInsets()
    上,仅丢弃顶部的插图
  • 覆盖视图的
    onSizeChanged()
    ,并在其中调用
    view#getRootWindowInsets()
    ,以获得顶部的插图(忽略其他插图)
这些综合价值观对我起了作用

不幸的是,这在API 20–22上不起作用,因为它没有实现
视图#getRootWindowInsets()
。在这里,你需要做一些猜测。幸运的是,这更容易,因为这些API没有实现拆分屏幕,但顶部的插入将是状态栏的高度,除非您明确要求将其隐藏(在这种情况下为0)。如果状态栏可见,其高度可按如下方式确定:

Resources resources = view.getResources();
int shid = resources.getIdentifier("status_bar_height", "dimen", "android");
padding_top = (shid > 0) ? resources.getDimensionPixelSize(shid) : 0;

天堂OS是一个rom,这有关系吗?像rom(只读存储器)或固件这样的术语现在实际上用词不当Android是一个功能齐全的OS,天堂OS、Android x86和各种特定于供应商的修改(用Linux的说法)只是发行版。Anbox有点不同,因为它在一个完整的Linux系统上提供了一个Android应用程序环境。当然,其中任何一个都可能有bug(它们都有),但我看到的行为是相当一致的。如果这是一个bug(我怀疑,但我可能是错的),它很可能存在于AOSP本身,我测试的所有发行版都只是从那里继承了它。感谢您演示了自定义操作系统,请使用仿真器在普通API上测试它,并将结果添加到问题中,与SDK中的仿真器的结果相同。在不同的发行版和版本中,行为是一致的。您是如何获得插入大小的?
Resources resources = view.getResources();
int shid = resources.getIdentifier("status_bar_height", "dimen", "android");
padding_top = (shid > 0) ? resources.getDimensionPixelSize(shid) : 0;