【问题标题】:CollapsingToolbarLayout elevation not working and anchored FloatingActionButton not returningCollapsingToolbarLayout 海拔不工作和锚定的 FloatingActionButton 不返回
【发布时间】:2015-08-14 01:22:59
【问题描述】:

我一直在尝试使用新的 Android Design Support Library 实现材料设计指南中的布局 similar to this。 CollapsingToolbarLayout 似乎是要走的路,但它忽略了任何增加海拔的尝试。此外,如果我将AppBarLayout 的高度设置为低于 144dp,FloatingActionButton 将弹出,但不会返回。这是我的 xml:

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
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="144dp"
    android:fitsSystemWindows="true"
    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"
        app:expandedTitleMarginEnd="72dp"
        app:expandedTitleMarginStart="72dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:paddingLeft="72dp"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/fab_margin"
    android:src="@drawable/ic_person_add_white_24dp"
    app:borderWidth="0dp"
    app:fabSize="mini"
    app:layout_anchor="@id/appbar"
    app:layout_anchorGravity="bottom|left|start"/>

【问题讨论】:

    标签: java android android-design-library androiddesignsupport android-collapsingtoolbarlayout


    【解决方案1】:

    深入研究源代码后,我发现FloatingActionButton,当附加到AppBarLayout时,设置为仅在可用空间为&lt;=appBarLayout.getMinimumHeightForVisibleOverlappingContent()时出现,即2*最小高度(Toolbar ,在这种情况下),加上状态栏。所以在手机上的纵向,56*2+26 = 138dp。我通过将我的设置为 138dp 来确认这一点,这有效,而 137dp 无效。如果你想解决这个问题,你可以覆盖AppBarLayout中的getMinimumHeightForVisibleOverlappingContent(),或者FloatingActionButton中的以下方法:

    public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
            if(dependency instanceof SnackbarLayout) {
                this.updateFabTranslationForSnackbar(parent, child, dependency);
            } else if(dependency instanceof AppBarLayout) {
                AppBarLayout appBarLayout = (AppBarLayout)dependency;
                if(this.mTmpRect == null) {
                    this.mTmpRect = new Rect();
                }
    
                Rect rect = this.mTmpRect;
                ViewGroupUtils.getDescendantRect(parent, dependency, rect);
                if(rect.bottom <= appBarLayout.getMinimumHeightForVisibleOverlappingContent()) {
                    if(!this.mIsAnimatingOut && child.getVisibility() == 0) {
                        this.animateOut(child);
                    }
                } else if(child.getVisibility() != 0) {
                    this.animateIn(child);
                }
            }
            return false;
        }
    

    至于CollapsingToolbarLayout 海拔,我还没有找到解决方法。

    【讨论】:

      【解决方案2】:

      对于CollapsingToolbarLayout 海拔,您可以在子类CollapsingToolbarLayout.OffsetUpdateListener 中搜索,该子类具有onOffsetChanged 方法

       if(Math.abs(verticalOffset) == scrollRange) {
           ViewCompat.setElevation(layout, layout.getTargetElevation());
       } else {
           ViewCompat.setElevation(layout, 0.0F);
       }
      

      【讨论】:

        【解决方案3】:

        关于高度,折叠工具栏布局在未折叠时显式删除高度*。它似乎已被归档为错误:

        https://code.google.com/p/android/issues/detail?id=192553&q=elevation&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened

        (正如@Ben 在他的回答和对源代码的引用中所说)

        直接链接到代码(当前为第 1062 行): https://android.googlesource.com/platform/frameworks/support/+/master/design/src/android/support/design/widget/CollapsingToolbarLayout.java#1062

        if (Math.abs(verticalOffset) == scrollRange) {
            // If we have some pinned children, and we're offset to only show those views,
            // we want to be elevate
            ViewCompat.setElevation(layout, layout.getTargetElevation());
        } else {
            // Otherwise, we're inline with the content
            ViewCompat.setElevation(layout, 0f);
        }
        

        【讨论】:

          猜你喜欢
          • 2016-05-22
          • 2014-12-25
          • 2017-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-03
          • 2018-03-05
          • 2015-01-11
          相关资源
          最近更新 更多