AppBarLayout中的错误:最初折叠时标题行为错误

时间:2016-09-23 14:32:11

标签: title android-collapsingtoolbarlayout android-appbarlayout

我使用典型的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。

找到了“解决方案”。简而言之:

  1. 在onLayout上覆盖CollapsingToolbarLayout

    onLayout(changed, ...) { if (changed) super.onLayout(true, ...); }

  2. 无需覆盖。比使用这个自定义的CollapsingToolbarLayout而不是支持库一。 不明白为什么,但这是必要的。

    1. 活动

      appBarLayout.post(... here first call of appBarLayout.setCollapsed() ... )

    2. 在完全测量和布局之前,请不要使用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的onLayoutgetDescendantRect,然后是mCollapsingTextHelper.setCollapsedBounds。 此时getDescendantRect计算标题的基本绝对位置。我想,计算出的位置有错误 - 它已经转移(CTL height - Window inset - Toolbar height)。上面的代码纠正了这个错误。

0 个答案:

没有答案