onApplyWindowInsets(WindowInsets insets)没有被调用

时间:2019-04-03 05:10:15

标签: kotlin android-custom-view android-constraintlayout

我当前正在使用扩展了约束布局的自定义视图,但是我不确定在onApplyWindowInsets(WindowInsets insets)视图中不会触发此重写的方法。

  class TestCustomView @JvmOverloads constructor(
  context: Context,
  attrs: AttributeSet? = null,
  defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {


    init {


    }
    //This method one not get called
    override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets {
    return super.onApplyWindowInsets(insets)
        val statusBarHeight = insets.systemWindowInsetTop
    }


    override fun fitSystemWindows(insets: Rect): Boolean {
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
      // Intentionally do not modify the bottom inset. For some reason,
      // if the bottom inset is modified, window resizing stops working.
      insets.left = 0
      insets.top = 0
      insets.right = 0
    }
    return super.fitSystemWindows(insets)
  }


}

3 个答案:

答案 0 :(得分:1)

一旦消耗了插图,就停止向下传播。似乎更高的东西正在消耗可用的东西。请参见 WindowsInset 中的isConsumed()

  

检查这些插图是否已被完全消耗。

     

如果已调用了适用的消耗*方法,使得所有插值均已设置为零,则将插值视为“已消耗”。这会影响插图在视图层次结构中的传播。未完全消耗的插图将继续传播到子视图。

答案 1 :(得分:0)

我认为,如果您想重置其windowInsets回调状态,则应更改sysUiVisibility参数以使fitsSystemWindows正常工作。因为fitsSystemWindows是使用windowInsets的键。您可以从android源代码中了解更多信息,当然,这需要时间。

答案 2 :(得分:0)

我发现没有将android:windowTranslucentStatus属性设置为true,就不会调用onApplyWindowInsets。我在阅读this unanswered question时发现了这一点。

styles.xml中:

<style name="ExampleTheme" parent="Theme.AppCompat.NoActionBar">
  <item name="android:windowTranslucentStatus">true</item>
</style>

我很想了解为什么会这样,以及是否有一种无需更改此属性即可调用它的方法。