onApplyWindowInsets (вставки WindowInsets) не вызывается

В настоящее время я использую настраиваемое представление, которое расширяет макет ограничения, но я не запускаю этот переопределенный метод в представлении onApplyWindowInsets (вставки WindowInsets), не уверен, что пропало.

  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)
  }


}

person Chinthaka Devinda    schedule 03.04.2019    source источник
comment
у кого-нибудь есть идеи?   -  person Chinthaka Devinda    schedule 03.04.2019
comment
Ок, отлично! Я думаю, вы можете опубликовать это как ответ, чтобы я мог принять его.   -  person Chinthaka Devinda    schedule 04.04.2019


Ответы (3)


Как только вставки используются, распространение вниз по иерархии останавливается. Похоже, что-то более высокое потребляет то, что доступно. См. isConsumed() в WindowsInset.

Проверьте, полностью ли израсходованы эти вставки.

Вставки считаются израсходованными, если применимые методы потребления* были вызваны таким образом, что все вставки были установлены в ноль. Это влияет на распространение вставок по иерархии представлений; вставки, которые не были полностью использованы, будут продолжать распространяться до дочерних представлений.

person Cheticamp    schedule 04.04.2019
comment
есть ли способ обнаружить верхнюю вставку для всех представлений? - person Chinthaka Devinda; 04.04.2019
comment
@ChinthakaDevinda Может быть, это? stackoverflow.com/a/38942268/6287910 - person Cheticamp; 04.04.2019
comment
@CheticampСпасибо за ответ. В моем случае у меня есть базовая активность, и я пытаюсь использовать ViewCompat.setOnApplyWindowInsetsListener(window.decorView.rootView), но это приводит к тому, что макет системы кнопки «Назад» перекрывает мое представление. - person Chinthaka Devinda; 04.04.2019
comment
Круто Наконец-то удалось ее решить. /* Из базовой активности передайте это как представление, но если я использую window.decorView.rootView, будут проблемы с наложением нижней панели. */ val containerView = findViewById‹View›(android.R.id.content) ViewCompat.setOnApplyWindowInsetsListener(containerView) { _, insets -> statusBarHeight = insets.systemWindowInsetTop insets } - person Chinthaka Devinda; 05.04.2019
comment
Кстати @Cheticamp, есть ли способ сбросить потребление вставки? любой доступный метод для его сброса. - person Chinthaka Devinda; 08.04.2019
comment
@ChinthakaDevinda Не то, чтобы я знал. - person Cheticamp; 08.04.2019

Я думаю, что если вы хотите сбросить состояние обратного вызова windowInsets, вы должны изменить параметры sysUiVisibility, чтобы fitsSystemWindows работало нормально. Поскольку fitsSystemWindows — это ключ для использования windowInsets. Вы можете узнать больше из исходного кода Android, конечно, вам нужно время.

person J.su    schedule 14.10.2019

Я обнаружил, что без свойства android:windowTranslucentStatus, установленного в true, onApplyWindowInsets никогда не вызывается. Я обнаружил это, прочитав этот вопрос без ответа.

In styles.xml:

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

Я хотел бы понять, почему это так, и если есть способ вызвать его, не требуя изменения этого атрибута.

person humblehacker    schedule 14.06.2020