如何禁用CollapsingToolbar在滚动没有内容时的折叠?

19

我正在使用Android Support Design库中的'com.android.support:design:22.2.1'。我的问题是,当滚动视图中没有内容时,折叠式工具栏仍然可以进行折叠操作。如果滚动视图中没有内容,我需要移除视图的折叠功能。

我的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="wrap_content"
                android:fitsSystemWindows="true"
                android:background="@android:color/white"
                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:expandedTitleMarginEnd="64dp"
                    app:expandedTitleMarginStart="48dp"
                    app:layout_scrollFlags="scroll|exitUntilCollapsed">

                    <fragment
                        android:id="@+id/pawfile_header"
                        android:name="com.lightbulb.pawesome.fragments.PawfileHeaderFragment"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dp"
                        android:layout_marginTop="10dp"
                        android:fitsSystemWindows="true"
                        app:layout_collapseMode="parallax" />

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

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

            <fragment
                android:id="@+id/pawfile_timeline"
                android:name="com.lightbulb.pawesome.user_timeline.PawesomeUserTimelineFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />

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

更新问题:

我完成了禁用和启用视图折叠。我使用了这行代码来禁用折叠:

AppBarLayout.LayoutParams appbarParams = (AppBarLayout.LayoutParams)     collapsingToolbar.getLayoutParams();
appbarParams.setScrollFlags(0);
collapsingToolbar.setLayoutParams(p);

问题是当scrollflags设置为0时,应用程序栏被强制具有高度。我尝试使用appbar.setElevation(0),但没有效果。如何从我的应用程序栏中移除高度?


app:layout_scrollFlags = "none"。这个可以行吗? - rKrishna
我该如何以编程方式实现这个? - Earwin delos Santos
这里有一个很好的评论 https://dev59.com/6VwY5IYBdhLWcg3wpI8-: "当我使用一个带有wrap_content属性的NestedScrollView作为主容器,以及一个TextView作为子元素时,AppBarLayout可以正常工作且不会滚动。" - Tanasis
请查看此答案自定义滚动视图行为 - Vasil Stolyarchuk
请查看此答案 自定义滚动视图行为 - Vasil Stolyarchuk
4个回答

29
获取您的AppBarLayout引用并设置setScrollFlags。
AppBarLayout.LayoutParams p = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
p.setScrollFlags(0);
toolbar.setLayoutParams(p);

3
这很有帮助!但是我怎么才能撤销折叠? - Earwin delos Santos
1
更新相同,请参考 https://developer.android.com/reference/android/support/design/widget/AppBarLayout.LayoutParams.html#setScrollFlags(int)。 - rKrishna
2
哎呀,我无法恢复视图的折叠... setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED),但无法启用折叠。 - Earwin delos Santos
2
尝试使用以下代码:setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS); - rKrishna
1
如何从AppBar中移除阴影?当我将滚动标志设置为0时,最终AppBar会显示出一个阴影。 - Earwin delos Santos
显示剩余5条评论

3

setScrollFlags 保持了工具栏的展开状态。setNestedScrollingEnabled 可以保留位置。这对我来说是最干净的解决方案。 - Samuel
1
你能解释一下为什么 appBarLayout.setExpanded(true, true) 会移除阴影吗?因为对我来说它并没有这个效果。 - anon

-2
为了防止折叠工具栏的崩溃,请勿在XML文件中添加app:layout_scrollFlags="scroll|exitUntilCollapsed"代码。您可以将该代码删除。

3
糟糕的屏幕滚动条。即使有内容需要滚动,它也不会崩溃。 - Bringoff

-3

通过“ scroll has no content in it”,我理解您的意思是“没有片段”。为此,我认为您需要先将 <fragment> 更改为 <FrameLayout>,然后使用getFragmentManager().beginTransaction() 以编程方式添加片段,然后检查片段是否存在(即不为null),如下所示:

    if (getFragmentManager().findFragmentById(R.id.fragment_name) != null) { 
           // here try RKNP's code to disable the appBar from collapsing 
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接