У меня есть сворачивающаяся панель инструментов и некоторый макет, который я хочу свернуть. Чтобы представление не уходило под строку состояния, я использую системные вставки, чтобы установить поле для сворачивающейся панели инструментов. Я извлек AppBarLayout
в отдельный файл и включил его в CoordinatorLayout
:
<com.google.android.material.appbar.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/action_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/app_white"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:background="@color/colorToolbar"
android:elevation="4dp"
android:focusable="true"
android:focusableInTouchMode="true"
app:contentInsetStartWithNavigation="0dp"
app:layout_collapseMode="pin">
...
</androidx.appcompat.widget.Toolbar>
<com.google.android.material.card.MaterialCardView
android:id="@+id/bonuses_widget"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="14dp"
app:cardElevation="3dp"
app:layout_collapseMode="parallax">
...
</com.google.android.material.card.MaterialCardView>
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
Поля для MaterialCardView
устанавливаются из кода, потому что макет не поддерживает добавление. Я добавляю поля для сворачивания панели инструментов с помощью вставок:
ViewCompat.setOnApplyWindowInsetsListener(action_bar) { _, insets ->
collapsing_toolbar.setMarginTop(insets.systemWindowInsetTop)
insets
}
Это хорошо работает, когда сворачивающаяся панель инструментов развернута, но в свернутом состоянии панель инструментов находится под строкой состояния:
Я прочитал этот вопрос, реализовал AppBarStateChangeListener
и использую его следующим образом:
action_bar.addOnOffsetChangedListener(object : AppBarStateChangeListener() {
override fun onStateChanged(appBarLayout: AppBarLayout, state: State) {
if (state == State.COLLAPSED) {
ViewCompat.setOnApplyWindowInsetsListener(collapsing_toolbar) { _, insets ->
toolbar.setMarginTop(insets.systemWindowInsetTop)
insets
}
}
if (state == State.EXPANDED) {
ViewCompat.setOnApplyWindowInsetsListener(collapsing_toolbar) { _, insets ->
toolbar.setMarginTop(0)
insets
}
}
}
})
Это не помогло, насколько я понимаю до сих пор, вставки строки состояния уже обрабатываются панелью действий, а сворачивающейся панели инструментов нечего обрабатывать. работало, но привело к другой проблеме:
В конце концов, я попытался удалить вставки и просто установил android:fitsSystemWindows="true"
на панель действий, это устраняет проблему с панелью инструментов под строкой состояния, но строка состояния неожиданно приобретает странный цвет (фиолетовый), который не представлен в цветах приложения.
Надеюсь, кто-то знает жарко правильно обращаться со вставками в этом случае.
setSupportActionBar()
? - person Sam Chen   schedule 18.06.2021