根据其状态更改折叠工具栏的插图
Change insets for collapsing toolbar depending on its state
我有折叠工具栏和其中的一些布局我想折叠。为了防止视图进入状态栏,我使用系统插入设置折叠工具栏的边距。我将 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
}
展开折叠工具栏时效果很好,但在折叠状态下工具栏位于状态栏下方:
我已阅读 this 问题,已实施 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"
设置为操作栏,这解决了状态栏下工具栏的问题,但状态栏意外地变成奇怪的颜色(紫色),这在应用程序中没有显示颜色。
希望有人知道在这种情况下如何正确处理插图。
您可以尝试在 Fragment
中调用 setSupportActionBar()
,因为这对我有用:
(requireActivity() as AppCompatActivity).apply {
//supportActionBar?.hide() //may need this to hide the Activity actionBar
setSupportActionBar(binding.toolbar)
}
setHasOptionsMenu(true) //don't forget this
最终我找到了合适的解决方案:
ViewCompat.setOnApplyWindowInsetsListener(action_bar) { view, insets ->
view.updatePadding(top = insets.systemWindowInsetTop)
insets
}
状态栏下的白色背景仍然存在问题(我需要像左侧屏幕截图那样将其设置为深色),但初步问题已解决。
我有折叠工具栏和其中的一些布局我想折叠。为了防止视图进入状态栏,我使用系统插入设置折叠工具栏的边距。我将 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
}
展开折叠工具栏时效果很好,但在折叠状态下工具栏位于状态栏下方:
我已阅读 this 问题,已实施 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"
设置为操作栏,这解决了状态栏下工具栏的问题,但状态栏意外地变成奇怪的颜色(紫色),这在应用程序中没有显示颜色。
希望有人知道在这种情况下如何正确处理插图。
您可以尝试在 Fragment
中调用 setSupportActionBar()
,因为这对我有用:
(requireActivity() as AppCompatActivity).apply {
//supportActionBar?.hide() //may need this to hide the Activity actionBar
setSupportActionBar(binding.toolbar)
}
setHasOptionsMenu(true) //don't forget this
最终我找到了合适的解决方案:
ViewCompat.setOnApplyWindowInsetsListener(action_bar) { view, insets ->
view.updatePadding(top = insets.systemWindowInsetTop)
insets
}
状态栏下的白色背景仍然存在问题(我需要像左侧屏幕截图那样将其设置为深色),但初步问题已解决。