我使用典型的AppBarLayout-CollapsingToolbarLayout-Toolbar捆绑包,它运行正常。但是,当我在app:expanded="false"
之前添加appBarLayout.setExpanded(false)
或collapsingToolbarLayout.setTitle()
时,我的行为会显示在下面的视频中。
https://youtu.be/OgSJomzYmek
这是布局:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:expanded="false"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:id="@+id/action_bar_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
android:src="@drawable/img_nature"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:elevation="4dp"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:backgroundTint="@color/colorPrimary"
app:layout_anchorGravity="bottom|right|end" />
</android.support.design.widget.CoordinatorLayout>
必须是支持库中的错误。
是否有正确折叠工具栏或任何解决方法的解决方案?
更新1。
找到了“解决方案”。简而言之:
在onLayout上覆盖CollapsingToolbarLayout
onLayout(changed, ...) {
if (changed) super.onLayout(true, ...);
}
无需覆盖。比使用这个自定义的CollapsingToolbarLayout而不是支持库一。 不明白为什么,但这是必要的。
活动
appBarLayout.post(... here first call of appBarLayout.setCollapsed() ... )
在完全测量和布局之前,请不要使用AppBarLayout。
更新2。
更新1不能完美运行。更好的解决方案 - 工作正常,至少有一段时间: 另一个解决方案似乎是完美的,至少有一段时间......
public class Toolbar extends android.support.v7.widget.Toolbar {
private Integer offset = null;
public Toolbar(Context context) {
super(context);
}
public Toolbar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public Toolbar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void offsetTopAndBottom(int offset) {
super.offsetTopAndBottom(offset);
if (this.offset == null)
this.offset = offset;
}
@Override
public int getTitleMarginTop() {
return offset == null ? super.getTitleMarginTop() : -getTop() + offset + super.getTitleMarginTop();
}
@Override
public int getTitleMarginBottom() {
return offset == null ? super.getTitleMarginBottom() : getTop() - offset + super.getTitleMarginBottom();
}
}
这就是全部。
当调用ABL的setExpanded
时,它会跟随CTL的onLayout
:getDescendantRect
,然后是mCollapsingTextHelper.setCollapsedBounds
。
此时getDescendantRect
计算标题的基本绝对位置。我想,计算出的位置有错误 - 它已经转移(CTL height
- Window inset
- Toolbar height
)。上面的代码纠正了这个错误。