问题标签 [windowinsets]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4116 浏览

android - OnApplyWindowInsetsListener 给出始终为 0 的 systemWindowInsetBottom

systemWindowInsetBottom 和 stableInsetBottom 都始终为 0

我有一个具有背景纹理的 Activity,并且我正在使用 FLAG_LAYOUT_NO_LIMITS 让该背景位于状态和导航栏的后面。但我不希望视图的其他内容落后于那些系统 UI 组件。

起初我想用resources.getIdentifier("navigation_bar_height", "dimen", "android")来获取导航栏的高度,但这只是导航栏的默认高度,所以它在用户隐藏导航栏的设备上不起作用。(三星设备)

然后我发现了 WindowInsets 和 android:fitsSystemWindows="true"

它适用于状态栏,但不适用于导航栏。

在我的活动中

还有我的布局

运行 API 28 的 Nexus 5x 模拟器的示例屏幕截图。在运行 API 26 的实际设备上获得相同的结果。

示例图像

如果导航栏存在,我该怎么做才能获得导航栏的实际大小?

0 投票
7 回答
6021 浏览

android - NULL 窗口插图

我正在尝试获取 DisplayCutout 并获取

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.view.DisplayCutout android.view.WindowInsets.getDisplayCutout()'

这是我的代码:

0 投票
0 回答
2057 浏览

android - 检查设备是否有服务中的缺口

我有一个带有覆盖层的应用程序,我需要检查设备是否有缺口。

通常您使用活动并调用以下内容:

任何其他方法来检查也适用于服务的缺口?如果设备有缺口,我需要调整我的覆盖...

如果我只能访问设备,有什么方法可以找出设备是否有缺口WindowManager

0 投票
12 回答
10579 浏览

android - setOnApplyWindowInsetsListener 从未调用过

我想计算导航栏的高度。我看过这个演示文稿:https ://chris.banes.me/talks/2017/becoming-a-master-window-fitter-nyc/

所以,我尝试使用该方法View.setOnApplyWindowInsetsListener()。但是,由于某种原因,它从未被调用过。

有谁知道为什么?有什么限制吗?

我试过这样使用它:

请注意,我的根布局是ConstraintLayout.

0 投票
1 回答
1031 浏览

android - onApplyWindowInsets 用奇怪的顶部插图调用

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

层次结构中的顶部视图覆盖onApplyWindowsInsets(). 实现只是记录WindowInsets它被传递的信息,然后调用超类方法,记录结果并返回它——没有任何修改。日志还显示超类方法没有修改插图。

现在我得到了一个看起来很奇怪的顶部插图,它似乎总是比我预期的多 56-72 dp:

注意:在横向模式下,有两次连续调用onApplyWindowInsets(),这里只报告最后一次。

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

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

据我所知,左/右/底部值似乎还可以。

我该如何纠正?我忽略了什么吗?

0 投票
2 回答
2289 浏览

android - 使用 WindowInsets 在 Android 上正确进行边到边处理

我正在尝试让边缘到边缘(https://youtu.be/OCHEjeLC_UY?t=1635)在 API 21 到 29 上正常工作。

我在我的v27\themes.xml

这在我的活动中:

另外,我正在设置android:fitsSystemWindows=true我的AppBarLayout.


有了这个,它在 API >= 27 上看起来很好,其中内容在现在透明的导航栏后面滚动,但在旧 API 上,内容被黑色导航栏覆盖。

我知道我需要获取WindowInsets并将其添加到我现有的填充中(或者如果AppBarLayout它自己处理插图),但我无法让它与 FAB 一起使用。

我发现这篇关于将插图添加到padding视图的文章,但因为 FAB 使用margin我不确定,如果我在正确的轨道上。


是否有任何文档,例如,关于如何在边缘到边缘处理插入的最佳实践?似乎有些小部件喜欢AppBarLayout优雅地处理它,但我怎样才能让 FAB 也调整它的边距?


更新 1

要指定,添加android:fitsSystemWindows=trueCoordinatorLayout它时也会处理插图,但有一个主要缺点:

我有两个布局,每个布局都有一个CoordinatorLayout:“父布局”定义了CoordinatorLayoutaAppBarLayout和 aFrameLayout来保存实际内容和放置在后者中的 Fragment 使用的“子布局”。

因此,我无法添加android:fitsSystemWindows=true到子布局,因为它会导致顶部(工具栏和内容之间)有一个空白空间,并且我不能将它放在父布局中,因为这样 FAB 将不会更新到插图.

0 投票
0 回答
275 浏览

android - getStableInsetTop() 总是返回 0?

我想获得稳定的系统 UI 插图。从中获取系统 UI(导航栏和状态栏)的高度和宽度。

问题:我使用了getSystemWindowInsetTop()windowInsets 类的方法,但是当屏幕进入沉浸式模式并且系统 UI(导航栏和状态栏)隐藏时它变为零。但我想要稳定的插图,这就是我尝试使用getStableInsetTop()方法的原因,它总是返回 0。

代码:

注意:我已经fitSystemWindows="true"在 XML 的父布局中添加了该属性。getSystemWindowInsetTop()工作正常并返回 Inset 值,但问题是它的值随系统 UI(导航栏和状态栏)的可见性而变化。

0 投票
1 回答
1136 浏览

android - 当状态栏被隐藏时,有没有办法防止布局“跳跃”?

我正在尝试使用视图寻呼机在我的应用程序中实现照片查看器。只需轻轻一按,我就能让系统 UI 消失(导航栏和状态栏)。我遇到的唯一问题是,每次我使状态栏消失并重新出现时,我的视图寻呼机上的布局都会开始抖动或跳跃。

我的实现的可视化

我要实现的

我已尝试按照堆栈溢出帖子中的建议设置系统 ui 标志。但它仍然给我“跳跃”的布局响应。

下面的代码是我用来隐藏/显示状态栏的代码:

我的视图寻呼机的 XML 代码:

0 投票
1 回答
696 浏览

android - 创建 WindowInsetsCompat 的实例

核心版本androidx.core:core:1.0.1

有什么合适的方法来创建WindowInsetsCompat实例吗?
如我所见,它具有私有构造函数:

它从 5 个方法和 1 个静态包装器中调用,具有包私有可见性:

那个wrap方法只用在里面的6个方法中ViewCompat,仅此而已。

那么,我们可以以某种方式创建 WindowInsetsCompat 的实例吗?
或者,唯一的方法是 cmd+c/cmd+v?

0 投票
3 回答
821 浏览

android - 如何将插图应用于带有图像的 CollapsingToolbarLayout,因此工具栏中的图像绘制在状态栏后面?

我正在尝试使用插图为 Android 10 设置全屏活动。我想在状态栏后面绘制工具栏中的图像。我尝试android:fitsSystemWindows在不同的组合中使用标志,但它不起作用,AppBarLayout没有正确的填充和状态栏与工具栏菜单控件略有重叠。所以我使用了方便的WindowInsetsCompat包装器,Chris Banes 的 Insetter 库,根据系统窗口插图设置填充。

这是我的布局:

这是我在代码中设置填充的方法:

我为全屏模式设置了窗口标志:

这是如图所示的结果:

不正确的填充示例

状态栏设置为透明,蓝色来自具有顶部填充的工具栏。

作为最终结果,我想在状态栏后面绘制图像,这可能吗?

我正在 Android 10 模拟器上进行测试。