锚定到应用栏的 FAB 不会在向上滚动时隐藏
Posted
技术标签:
【中文标题】锚定到应用栏的 FAB 不会在向上滚动时隐藏【英文标题】:FAB anchored to app bar doesn't hide on scrolling up 【发布时间】:2015-11-05 10:39:31 【问题描述】:我已将 FAB 锚定到 AppBarLayout。但是,在向上滚动时,FAB 的预期行为是在工具栏折叠时隐藏。这不会发生。
这个需要特殊处理吗?
我定义的布局如下:
<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/rootLayout"
android:layout_
android:layout_
android:fitsSystemWindows="true">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_
android:layout_
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_
android:layout_
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_
android:layout_
android:background="@color/my_primary"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginBottom="20dp"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="16dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<!--<ImageView-->
<!--android:id="@+id/backdrop"-->
<!--android:layout_-->
<!--android:layout_-->
<!--android:fitsSystemWindows="true"-->
<!--android:scaleType="centerCrop"-->
<!--app:layout_collapseMode="parallax" />-->
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_
android:layout_
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.CollapsingToolbarLayout>
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_
android:layout_
android:gravity="bottom"
app:tabMode="scrollable" />
</android.support.design.widget.AppBarLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_
android:layout_
android:layout_margin="16dp"
android:clickable="true"
android:src="@drawable/ic_stop_white_24dp"
app:layout_anchor="@id/appbar"
app:layout_anchorGravity="bottom|right|end" />
【问题讨论】:
你试过添加滚动标志吗? 已添加滚动标志。请参考发布的布局 我的意思是滚动标志到工厂 @MufaddalGulshan 它有效。我用 reyclerview 试了一下,没有 viewpager。用奶酪广场试了一下 @NikolaDespotoski 滚动标志不起作用.. 【参考方案1】:<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:fitsSystemWindows="true"
tools:context=".ScrollingActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar"
android:fitsSystemWindows="true"
android:layout_
android:layout_
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:fitsSystemWindows="true"
android:layout_
android:layout_
app:toolbarId="@+id/toolbar"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:contentScrim="?attr/colorPrimary">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_
android:layout_
app:layout_collapseMode="pin"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_scrolling"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_
android:layout_
android:layout_margin="@dimen/fab_margin"
app:layout_anchor="@id/app_bar"
app:layout_anchorGravity="bottom|end"
app:srcCompat="@android:drawable/ic_dialog_email"/>
</android.support.design.widget.CoordinatorLayout>
【讨论】:
如果可能,请提供您的解决方案的详细信息。【参考方案2】:我不知道它是否仍未解决。但我会把它留在这里希望它可以帮助别人。我也遇到了这个问题,并通过实现 AppBarStateChangeListener 然后以编程方式隐藏/显示浮动操作按钮来解决。
这是完整的实现:
public abstract class AppBarStateChangeListener implements AppBarLayout.OnOffsetChangedListener
public enum State
EXPANDED,
COLLAPSED,
IDLE
private State mCurrentState = State.IDLE;
@Override
public final void onOffsetChanged(AppBarLayout appBarLayout, int i)
if (i == 0)
if (mCurrentState != State.EXPANDED)
onStateChanged(appBarLayout, State.EXPANDED);
mCurrentState = State.EXPANDED;
else if (Math.abs(i) >= appBarLayout.getTotalScrollRange())
if (mCurrentState != State.COLLAPSED)
onStateChanged(appBarLayout, State.COLLAPSED);
mCurrentState = State.COLLAPSED;
else
if (mCurrentState != State.IDLE)
onStateChanged(appBarLayout, State.IDLE);
mCurrentState = State.IDLE;
public abstract void onStateChanged(AppBarLayout appBarLayout, State state);
然后应用它:
appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener()
@Override
public void onStateChanged(AppBarLayout appBarLayout, State state)
if(state == State.COLLAPSED)
fab.hide();
else if(state == State.EXPANDED)
fab.show();
);
【讨论】:
【参考方案3】:@MufaddalGulshan,View Pager 可能是问题所在。使用回收站视图或 NestedScrollView。我从here 读到,只有支持“嵌套滚动”的视图才能处理这种行为。
【讨论】:
【参考方案4】:也许设置一个滚动监听器来滚动视图并按需隐藏工厂。
【讨论】:
以上是关于锚定到应用栏的 FAB 不会在向上滚动时隐藏的主要内容,如果未能解决你的问题,请参考以下文章
向上滚动 tableview 以隐藏导航栏的一半,整个表格得到偏移
锚定到 div 以转到 div 上方的某个点以允许固定标题 [重复]