CollapsingToolbar在内容不够高的情况下无法正常工作

25

我相信这是一个bug,所以我想要一个解决方法。我的布局如下:

<CoordinatorLayout>

    <AppBarLayout>
        <CollapsingToolbarLayout>
            <ImageView/>
            <Toolbar/>
        </CollapsingToolbarLayout>
    </AppBarLayout>

    <android.support.v4.widget.NestedScrollView/> <!-- content here -->

</CoordinatorLayout>

我正在从网络检索内容,并且不知道它有多高——可能只有几行,也可能非常长。
然而,我发现当内容不足以覆盖整个屏幕时,CollapsingToolbar表现不佳。情况如下:

  • content.height > screen.height :能够正常工作;向上/向下滑动可以展开和折叠工具栏,并滚动内容;

  • content.height < screen.height :不能正常工作。这不好,因为大部分情况下(content.height + expandedToolbar.height) > screen.height

换句话说,当内容不够高时,即使content+expandedToolbar的高度比整个屏幕还要高得多,它也无法响应滚动手势并显示一些错误。你可能需要进行十次手势才能稍微折叠工具栏。因此,你几乎无法到达底部的内容,因为工具栏已经展开了并且隐藏了底部的内容。

有什么解决方法吗?

如果您想尝试,请使用cheesesquare示例项目,并删除(或减少)activity_detail.xml中NestedScrollView内的内容[这里是API17]。

1个回答

27

关键是在NestedScrollView中添加android:layout_gravity="fill_vertical",这样工具栏就可以平滑地折叠和展开,并对于任何非空的NestedScrollView都会响应滚动手势,无论其大小。

当然,如果滚动视图为空,则在屏幕的“内容”部分滚动时工具栏不会折叠。但这对我来说似乎并不那么糟糕。

更新

看起来这个解决方案在处理更大的内容时存在一些问题,因为内容的底部部分仍将保持隐藏状态。我发现隐藏的部分(貌似)与折叠的工具栏高度相同。这使得定义解决方法变得容易 - 只需向ScrollView的底部添加一个边距,以便测量并释放底部的隐藏部分。因此:

android:layout_gravity="fill_vertical"
android:layout_marginBottom="?attr/actionBarSize"

请注意,此解决方案适用于您在视图中为Toolbar设置的任何大小。请注意,此解决方案适用于小型和大型内容,但在较小的内容上滚动不太平滑。

更新2(2015年7月)

从早期测试来看,这个bug已经在Support Design Library的v22.2.1版本中得到修复。


2
我已经使用了v23.0.1版本。但是我的NestedScrollView中的底部内容仍然被隐藏,而这个NestedScrollView又在CollapsingToolbarLayout中。正如你所说,它的大小与工具栏相同。可能出了什么问题?我应该开一个新的问题吗? - Dark Leonhart
@Dark 你是指在CollapsingToolbarLayout内部使用NestedScrollView吗?是的,我们需要看到你的布局。如果需要,请告诉我。 - natario
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - VKDev
我的问题与上面的VKDev相同。如果我尝试使用你的修复方法,它在第一次膨胀布局时有效,但旋转后会在屏幕底部留下一个边距。请帮忙。 - Luke Allison
1
请查看此链接:http://stackoverflow.com/questions/35893187/using-the-master-detail-template-in-viewpager-fragments-download-link 。升级库并不能解决这个问题。 - Luke Allison

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