我当前正在使用扩展了约束布局的自定义视图,但是我不确定在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)
}
}
答案 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>
我很想了解为什么会这样,以及是否有一种无需更改此属性即可调用它的方法。