Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是插页?_Java_Android_Android Layout_Android View_Windowinsets - Fatal编程技术网

Java 什么是插页?

Java 什么是插页?,java,android,android-layout,android-view,windowinsets,Java,Android,Android Layout,Android View,Windowinsets,我试图了解安卓操作系统,在阅读谷歌I/O 2014应用程序时,我遇到了窗口插页。如果有人能解释他们是什么,那将是一个很大的帮助。谢谢。您可以了解有关的所有信息窗口插图为您提供窗口上应用程序可用的区域。它本身没有多大用处。当您重写View.onApplyWindowInsets或实现View.OnApplyWindowInsetsListener时,这才是真正的目的。你可以在这里读到他们:和 侦听器,用于以自定义方式在视图上应用窗口插入 如果应用程序想要应用,它们可以选择实现此接口 自定义策略,以

我试图了解安卓操作系统,在阅读谷歌I/O 2014应用程序时,我遇到了
窗口插页
。如果有人能解释他们是什么,那将是一个很大的帮助。谢谢。

您可以了解有关的所有信息<代码>窗口插图为您提供窗口上应用程序可用的区域。它本身没有多大用处。当您重写
View.onApplyWindowInsets
或实现
View.OnApplyWindowInsetsListener
时,这才是真正的目的。你可以在这里读到他们:和

侦听器,用于以自定义方式在视图上应用窗口插入

如果应用程序想要应用,它们可以选择实现此接口 自定义策略,以指定视图处理窗口插入的方式。如果 已设置OnApplyWindowInsertsListener,其OnApplyWindowInserts方法 将调用,而不是视图自己的onApplyWindowInsets方法。 侦听器可以选择调用参数视图的 onApplyWindowInsets方法将视图的正常行为作为应用程序的一部分 它自己的


简而言之,覆盖此选项将允许您控制可供查看的窗口区域。

窗口插入是应用于窗口的系统视图(例如状态栏、导航栏)的插入(或大小)

用具体的例子很容易理解。想象一下这个场景:

现在,您不希望将
WindowInsets
应用于背景
ImageView
,因为在这种情况下,
ImageView
将由状态栏高度填充

但您确实希望将插入应用于
工具栏
,因为否则
工具栏
将在状态栏中间的某个位置绘制

该视图声明希望在xml中应用
WindowInsets
,它说:

android:fitsSystemWindows="true"
在本例中,您无法将
窗口插入
应用于根布局,因为根布局将使用
窗口插入
,并且将填充
图像视图

相反,您可以使用
ViewCompat.setonapplyWindowInsertsListener
将插入应用于工具栏:

ViewCompat.setOnApplyWindowInsetsListener(toolbar, (v, insets) -> {
            ((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin =
                    insets.getSystemWindowInsetTop();
            return insets.consumeSystemWindowInsets();
        });
注意,当
工具栏
的根布局将
窗口插入
传递给其子级时,将调用此回调。像
FrameLayout
LinearLayout
这样的布局不允许,
DrawerLayout
CoordinatorLayout
这样的布局不允许

您可以对布局进行子类化,例如,
FrameLayout
和覆盖应用程序窗口插页上的

@TargetApi(Build.VERSION_CODES.KITKAT_WATCH)
@Override
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
    int childCount = getChildCount();
    for (int index = 0; index < childCount; index++)
        getChildAt(index).dispatchApplyWindowInsets(insets); // let children know about WindowInsets

    return insets;
}
@TargetApi(Build.VERSION\u code.KITKAT\u WATCH)
@凌驾
公共窗口插页在应用窗口插页上(窗口插页插页){
int childCount=getChildCount();
for(int index=0;index

伊恩·莱克也有一份关于这件事的报告“成为主窗口装配工Android系统使用屏幕的某些部分来呈现自己的内容,例如顶部的状态栏和底部的导航栏。例如,如果应用程序希望在底部栏后面渲染,则应考虑底部栏所占用的区域,否则应用程序UI将与系统UI冲突,您将得到如下结果:

在上面的图像上,应该在FAB按钮上添加一个额外的底部边距,这样按钮就不会与底部栏相交。允许您获取系统UI使用的底部插图等信息。您经常会遇到具有类似用途的
fitsystemwindows
属性,有关该属性的更多信息,以及何时应使用该属性而不是
WindowInsets
。你也可以看看这篇很棒的文章:。等等,什么是手势导航

嗯,视觉重叠不是你能面对的唯一问题。自从安卓10(API 29)以来,增加了一种新的手势导航模式。现在,用户可以选择使用手势在应用程序之间导航,而不是像上图中那样使用按钮栏。现在强烈建议应用程序在导航栏后面绘制,这样用户将拥有更现代的用户体验。除此之外,还引入了一种新的插入类型-手势插入。如果选择手势导航模式,则应用程序手势可能与系统手势冲突。例如,让我们看一看下图:

如您所见,搜索栏太靠近底部边缘,与系统快速切换手势冲突。由于系统手势具有更高的优先级,搜索栏变得不可用。本文详细描述了这些示例以及其他常见场景

我上面提到的文章是安卓团队成员编写的系列文章的一部分。如果你想更深入地理解这个主题,我建议你阅读整个系列。另一篇文章可能也会有所帮助,它描述了WindowInsets API中正在进行的更改以及新的IME insets类型

参考:


图片取自文章


²图像取自文章

,因此,为了在线性布局中应用插图,我需要对其进行子分类,对吗?您将如何处理此棒棒糖预制品?DispatchApplyWinSets的compat版本似乎需要WindowInsetCompat。