标签: android-appbarlayout

当NestedScrollView为空时,停止AppBarLayout滚动屏幕

我有一个相当典型的List功能,使用CoordinatorLayout,AppBarLayout,SwipeRefreshLayout和RecyclerView -

当RecyclerView有足够的内容滚动时,页面似乎很好.当RecyclerView为空或者没有足够的内容可以滚动时,行为是AppBarLayout子节点app:layout_scrollFlags="scroll|enterAlwaysCollapsed"将继续滚动 - 这看起来很奇怪.

当NestedScrollView为空时,有没有办法阻止AppBarLayout子项滚动?

在此输入图像描述

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    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.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinatorLayout"
        android:background="@android:color/transparent"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            android:elevation="4dp">

            <LinearLayout
                android:id="@+id/eventHeader"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="16dp"
                android:background="@color/green"
                android:orientation="horizontal"
                app:layout_scrollFlags="scroll|enterAlwaysCollapsed">

                <View
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    android:layout_weight="1"/>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="scroll|enterAlwaysCollapsed"
                    android:textColor="@color/white"
                    android:textSize="15sp"/>

                <View
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    android:layout_weight="1"/>

            </LinearLayout>

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

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipeToRefresh"
            android:layout_width="match_parent"
            android:layout_gravity="fill_vertical"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@android:color/transparent"
                android:dividerHeight="0dp"
                android:layout_gravity="fill_vertical"
                android:drawSelectorOnTop="true"
                android:listSelector="@drawable/selector_ripple_grey_transparent"
                android:scrollbars="vertical"/>

        </android.support.v4.widget.SwipeRefreshLayout>

    </android.support.design.widget.CoordinatorLayout>

    <TextView
        android:id="@+id/noData"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="16dp"
        android:text="@string/no_data_available"
        android:textSize="17sp"/>

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview android-appbarlayout

14
推荐指数
1
解决办法
4605
查看次数

禁用工具栏滚动

我有当前的设置:

<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/coordiator_layout_in_main"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize"
        app:layout_scrollFlags="scroll|enterAlways"/>
</android.support.design.widget.AppBarLayout>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <android.support.design.widget.NavigationView
        android:layout_width="170dp"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"/>

    <FrameLayout
        // I place a fragment containing a viewpager containing    fragments that contain a recyclerview.... 
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_toRightOf="@+id/nav_view">

    </FrameLayout>
</RelativeLayout>

<FrameLayout
    android:id="@+id/settings_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="invisible">
</FrameLayout>

<android.support.design.widget.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_refresh"
    app:layout_anchor="@id/coordiator_layout_in_main"
    app:layout_anchorGravity="bottom|right|end"   
   app:layout_behavior="com.material.widget.MyFloatingActionButtonBehavior" />

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

现在一切都按预期工作,如果我在包含片段的framelayout内滚动,工具栏可以根据需要滑入和滑出

现在重点是,如果我滚动位于framelayout侧面的NavView(以及relativelayout内部),我想禁用工具栏滑入和滑出

但无论我是否删除所有滚动行为,工具栏都会继续滑入和滑出(只有禁用它的方法是从appbarlayout中移除滚动标记,但禁止所有滑入和滑出tolbar)

请问我在这里错过了什么?是不是应该将滚动事件传递给CoordinatorLayout的scolling行为?

android android-design-library androiddesignsupport android-coordinatorlayout android-appbarlayout

14
推荐指数
3
解决办法
1957
查看次数

AppBarLayout.ScrollingViewBehavior的数学如何运作?

offsetChildAsNeeded在运行滚动更改时,我会在AppBarLayout.ScrollingViewBehavior中观察该方法的数学流程.

由于它是私有方法和私有方法mOffsetDelta,如何以编程方式监视它们?

(目前尚不清楚该方法是如何使用的offset.)

private void offsetChildAsNeeded(CoordinatorLayout parent, View child, View dependency) {
    final CoordinatorLayout.Behavior behavior =
                ((CoordinatorLayout.LayoutParams) dependency.getLayoutParams()).getBehavior();
    if (behavior instanceof Behavior) {
        // Offset the child, pinning it to the bottom the header-dependency, maintaining
        // any vertical gap, and overlap
        final Behavior ablBehavior = (Behavior) behavior;
        final int offset = ablBehavior.getTopBottomOffsetForScrollingSibling();
        ViewCompat.offsetTopAndBottom(child, (dependency.getBottom() - child.getTop())
                + ablBehavior.mOffsetDelta
                + getVerticalLayoutGap()
                - getOverlapPixelsForOffset(dependency));
        }
    }
Run Code Online (Sandbox Code Playgroud)

注意:欢迎,也可以接受回复那些解释数学的逻辑getTopBottomOffsetForScrollingSibling(),和(dependency.getBottom() - child.getTop()),和内容的细节mOffsetDelta

android android-coordinatorlayout android-appbarlayout

14
推荐指数
1
解决办法
597
查看次数

由于支持lib 26.0.0,因此折叠工具栏会出现故障

自Android支持库从版本25.4.0更新到26.0.0(最高27.0.0)后,我在Collapsing Toolbar内部活动中遇到了一些奇怪的行为.

看看这些GIF的不同之处:

向上滚动时,您会看到折叠工具栏的奇怪反弹.

请参阅以下布局的代码片段:

<?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:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white_opacity10"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
            app:scrimAnimationDuration="@integer/scrim_animation_short"
            app:titleEnabled="false">

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                app:layout_collapseMode="parallax">

                <!-- Here is layout of header -->

            </FrameLayout>

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:layout_gravity="top"
                android:layout_marginBottom="?attr/actionBarSize"
                app:layout_collapseMode="pin"/>

            <android.support.design.widget.TabLayout
                android:id="@+id/tabLayout"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:layout_gravity="bottom"
                app:tabGravity="center"
                app:tabMode="scrollable"
                app:tabSelectedTextColor="@color/white"
                app:tabTextColor="@color/white_inactive"/>

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

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

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </FrameLayout>

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

有人遇到同样的问题吗?这是支持lib bug,还是我做错了什么?

编辑:

android android-coordinatorlayout android-collapsingtoolbarlayout android-appbarlayout

14
推荐指数
1
解决办法
2073
查看次数

与CollapsingToolbarLayout一起使用时,NestedScrollView不会滚动到结尾

我想将NestedScrollView与CollapsingToolbarLayout一起使用.在NestedScrollView中,内容确实很长.不幸的是我无法滚动到最后.一些长期内容被削减.当我转动屏幕,滚动工作正常并且所有内容都可见时,有什么奇怪的.

<android.support.design.widget.CoordinatorLayout
    android:fitsSystemWindows="true"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <android.support.design.widget.AppBarLayout
        android:fitsSystemWindows="true"
        android:layout_height="wrap_content"
        android:layout_width="match_parent">

        <android.support.design.widget.CollapsingToolbarLayout
            android:fitsSystemWindows="true"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:fitsSystemWindows="true"
                android:layout_height="wrap_content"
                android:layout_width="match_parent"
                android:scaleType="centerCrop"
                android:src="@drawable/u8"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar
                android:layout_height="?attr/actionBarSize"
                android:layout_width="match_parent"
                app:layout_collapseMode="pin"/>

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

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

    <android.support.v4.widget.NestedScrollView
        android:clipToPadding="false"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:orientation="vertical">

            <!-- lots of widgets-->

        </LinearLayout>

    </android.support.v4.widget.NestedScrollView>

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

编辑:我注意到切割内容的高度与工具栏高度相同.

layout android android-collapsingtoolbarlayout android-appbarlayout nestedscrollview

13
推荐指数
3
解决办法
5942
查看次数

使用AppBarLayout.Behavior使用NestedScrollView顺利运行AppBarLayout

我有一个AppBarLayout和NestedScrollView.我想要NestedScrollView,只要它向下滚动,AppBarLayout也应该正常展开,而不会在AppBarLayout展开之前停止NestedScrollView; 完成第二次飞行/滚动需要完成.

我检查stackoverflow,发现这个解决方案非常相关,可以使用.但是如果是NestedScrollView,那就是RecyclerView.它位于/sf/answers/2271808521/

我基本上拿了代码并稍微改了一下,并用来检查速度> 8000以考虑将AppBarLayout作为下面的代码.

public final class FlingBehavior extends AppBarLayout.Behavior {
    private boolean isPositive;

    public FlingBehavior() {
    }

    public FlingBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) {
        if (velocityY > 0 && !isPositive || velocityY < 0 && isPositive) {
            velocityY = velocityY * -1;
        }

        if (target instanceof NestedScrollView && Math.abs(velocityY) > 8000) {
            consumed = false;
        }
        return super.onNestedFling(coordinatorLayout, child, …
Run Code Online (Sandbox Code Playgroud)

android android-appbarlayout nestedscrollview android-nestedscrollview

13
推荐指数
1
解决办法
4689
查看次数

工具栏在状态栏下滚动

我正在尝试学习CoordinatorLayout及其功能.我已经将它与AppBarLayout结合使用了.我的xml如下:

<android.support.design.widget.CoordinatorLayout

android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

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

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_scrollFlags="scroll|enterAlways" />

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

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_gravity="bottom|end"
        style="@style/FabStyle"/>

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

我面临的问题是滚动工具栏位于状态栏下方.我想滚动Recycler View时工具栏滚动,但我不希望它在状态栏下面.我该如何防止这种情况发生.

此外,当我尝试将CoordinatorLayout封装在另一个布局中时,例如:LinearLayout,主题中定义的primaryDark颜色不会显示在状态栏中.当我使用它作为上面的xml时,它显示了primaryDark颜色.有一个更好的方法吗?

android android-toolbar android-coordinatorlayout android-appbarlayout

12
推荐指数
2
解决办法
8343
查看次数

appBarLayout在setVisibility(View.GONE)之后占用空格

我想隐藏我的AppBarLayout以动态添加视图,这将占用屏幕的高度.为此,我想通过将AppBarLayout的可见性设置为GONE来临时删除视图.视图不可见,但占据屏幕空间(屏幕高度的一半).

我的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:id="@+id/coordinatorFriendProfil"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#81D4FA"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/fProfilAppBar"
    android:layout_width="match_parent"
    android:layout_height="250dp"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/fProfilCollapsing"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#B3E5FC"
        android:gravity="center"
        android:orientation="vertical"
        app:contentScrim="#03A9F4"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <LinearLayout
            android:id="@+id/fProfilUserInfo"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical">

            <com.neden.neden.RoundedImageView
                android:id="@+id/ivFriendPicture"
                android:layout_width="150sp"
                android:layout_height="150sp"
                android:layout_gravity="center"
                android:fitsSystemWindows="true"
                android:src="@drawable/photo"
                app:border_color="#64B5F6"
                app:border_width="4dp"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.7" />

            <TextView
                android:id="@+id/fProfilName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="15pt" />

        </LinearLayout>

        <android.support.v7.widget.Toolbar
            android:id="@+id/fProfilToolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:layout_scrollFlags="scroll|enterAlways" />

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

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

<FrameLayout
    android:id="@+id/fProfilContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
Run Code Online (Sandbox Code Playgroud)

我想添加图像来显示问题,但我不能因为我的声誉.对不起英语很糟糕,我的发言不太好.

android android-coordinatorlayout android-collapsingtoolbarlayout android-appbarlayout

12
推荐指数
2
解决办法
4025
查看次数

在AppBarLayout中滚动第二个孩子

我试图获得这种效果,如果用户滚动RecyclerView某个布局与回收器一起向上滚动并消失在后面Toolbar.

使用可以获得类似的行为CoordinatorLayout,这可以通过设置来实现

app:layout_behavior="@string/appbar_scrolling_view_behavior"
Run Code Online (Sandbox Code Playgroud)

在上述Recycler,并做

<android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_scrollFlags="scroll|enterAlways"/>

</android.support.design.widget.AppBarLayout>
Run Code Online (Sandbox Code Playgroud)

此外,如果我将第二个孩子放入其中AppBarLayout并设置app:layout_scrollFlags为它,则获得的效果是相同的,两个布局都与Recycler一起滚动.

我想要实现的是保持第一个孩子(工具栏)固定在位,让第二个孩子(a LinearLayout)滚动并隐藏在工具栏后面.不幸的是我无法达到这种行为.

没有使用第三部分库可以吗?提前致谢,对不起我的英语.

android custom-scrolling android-coordinatorlayout android-appbarlayout

12
推荐指数
1
解决办法
654
查看次数

向下滑动可扩展工具栏

在我的应用程序中,我有一个折叠工具栏.如果我启动一个特定的片段,我想要折叠工具栏,使其表现得像一个"正常",并且用户不能自己花费它.这是我用于工具栏的布局:

<android.support.design.widget.AppBarLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/appBarLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:titleEnabled="false"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <ImageView
            android:src="@drawable/drawer_background"
            app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
            android:layout_width="match_parent"
            android:layout_height="172dp"
            android:scaleType="centerCrop"
            app:layout_collapseMode="parallax"
            android:minHeight="100dp" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolBar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:layout_scrollFlags="scroll|enterAlways" />

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

</android.support.design.widget.AppBarLayout>
Run Code Online (Sandbox Code Playgroud)

我也可以从代码中折叠布局,如下所示:

appBarLayout.setExpanded(false, false);

final AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams();
params.setScrollFlags(0);
collapsingToolbarLayout.setLayoutParams(params);
Run Code Online (Sandbox Code Playgroud)

但这没有用.如果用户从工具栏向下滑动,它将展开.

你有什么想法吗?

android android-toolbar android-appbarlayout

12
推荐指数
2
解决办法
4618
查看次数