Android fitsSystemWindows与WindowInsets

https://developer.android.com/reference/android/view/WindowInsets.html

fitsSystemWindows

  • View#setFitsSystemWindows
    void setFitsSystemWindows(boolean fitSystemWindows)

    设置此视图是否应考虑系统屏幕装饰(例如状态栏)并插入其内容,即控制View#fitSystemWindows(Rect)的默认实现是否执行

  • View#dispatchApplyWindowInsets
    WindowInsets dispatchApplyWindowInsets(WindowInsets insets)

    派发请求到这个视图或其子树中的其它视图,以应用给定的 window insets

    此方法应该由希望应用与窗口装饰或覆盖层遮蔽的区域对应的inset的客户端来调用。
    可以包括状态和导航栏,动作栏,输入法等等。 未来可能会添加新的inset类别。
    该方法返回提供的 inset 减去了此视图或其子节点应用的任何值。

    希望提供自定义行为的客户端应该覆盖onApplyWindowInsets(WindowInsets)方法,或者通过setOnApplyWindowInsetsListener方法提供一个View.OnApplyWindowInsetsListener。

  • View#onApplyWindowInsets
    WindowInsets onApplyWindowInsets(WindowInsets insets)

    视图根据其内部策略应用WindowInsets时调用,可以覆盖此方法来应用与默认行为不同的策略。

    该方法的实现应该返回未修改的insets参数,或从insets参数克隆且消耗了此视图所应用inset的新WindowInsets。这允许在不改变现有实现就可以在未来平台版本中添加的新inset类型而不会被错误地消耗。

    默认情况下,如果设置了fitsSystemWindows属性,视图将消耗系统窗口inset并将其用作padding

  • View#setOnApplyWindowInsetsListener
    void setOnApplyWindowInsetsListener(View.OnApplyWindowInsetsListener listener)

    提供以自定义方式在视图上应用窗口insets的监听器。

    如果设置了此监听器,将不会调用View#onApplyWindowInsets方法。
    如有需要可以在监听器的实现中调用View#onApplyWindowInsets。

    public interface OnApplyWindowInsetsListener { 
        WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);
    }
    
  • View#fitSystemWindows
    boolean fitSystemWindows(Rect)

    此方法已于API20废弃,改用dispatchApplyWindowInsets。

    该方法的默认实现方式只是将内容inset到视图的padding中,消耗该内容(修改insets为0),并返回true
    此行为默认关闭,可以通过setFitsSystemWindows(boolean)启用。

WindowInsets

描述一组窗口内容的insets。

WindowInsets是不可变的。
要调整insets,请使用提供的克隆方法(WindowInsets#consume*)之一获取具有已调整属性的新WindowInsets实例。

如果调用了WindowInsets#consume*方法,使所有inset设置为零,则Insets被视为“已消费”。 这会影响inset通过视图层次结构的传播; 未完全消费的inset将继续传播到子视图

目前有下列几种insets类型(将来可能会添加更多):

  • stable insets
    表示可能被系统UI元素部分或完全遮蔽的全屏窗口区域。
    该值不会根据这些元素的可见性状态而改变。
    例如,如果状态栏通常显示但暂时隐藏,则stable inset仍将提供与显示的状态栏相关联的inset
  • system window insets
    表示由状态栏,导航栏,IME或其他系统窗口部分或完全遮挡的全屏窗口区域。。
  • window decor insets
    表示由框架提供的窗口里的装饰(动作栏,标题栏,工具栏…)部分或完全遮挡的内容窗口区域。
欢迎打赏,谢谢支持~