Принятый ответ работал со старыми версиями библиотек поддержки, где Snackbar
был просто прямоугольным представлением. На самом деле при изменении поля на отрицательное значение просто отсекается нижняя часть SnackbarLayout
(макет контейнера Snackbar
), поэтому более новые версии, в которых Snackbar
имеет закругленные углы, плохо смотрятся с этим решением.
Подсказка находится здесь в коде: https://github.com/material-components/material-components-android/blob/cd59e98f7e2185ddb075ff0fc91f29765d562968/lib/java/com/google/Translation/materialBomnsackbar/snackbar/snackbar/.java#L272
На самом деле происходит то, что к контейнеру добавляется заполнение, поэтому способ правильно исправить высоту - это сбросить заполнение до правильного значения. Вы можете сделать это, добавив дополнительный OnApplyWindowInsetsListener
, например следующий (установка нижнего отступа таким же, как верхний, заставит Snackbar
выглядеть нормально):
ViewCompat.setOnApplyWindowInsetsListener(snackbar.view) { v, insets ->
v.setPadding(v.paddingLeft, v.paddingTop, v.paddingRight, v.paddingTop)
insets
}
Затем, поскольку Snackbar
теперь будет иметь правильную высоту, но появится за полупрозрачной панелью навигации, вы можете увеличить нижнее поле на значение нижней вставки:
ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets ->
v.setPadding(v.paddingLeft, v.paddingTop, v.paddingRight, v.paddingTop)
val params = v.layoutParams as ViewGroup.MarginLayoutParams
params.updateMargins(
params.leftMargin,
params.topMargin,
params.rightMargin,
params.bottomMargin + insets.systemWindowInsetBottom
)
v.layoutParams = params
insets
}
Фактически это было исправлено в альфа-библиотеках Material 1.1.0 (теперь библиотека меняет поля, а не отступы), но они, вероятно, еще не готовы к производственному использованию.
person
Philio
schedule
04.07.2019