我一直在尝试重现 5.0 版的联系人应用程序在滚动列表视图时折叠工具栏的方式。
展示所需交互的截图画廊 注意工具栏分阶段的折叠,其中显示搜索+最后一个联系人,淡出最后一个联系人,折叠最后一个联系人,折叠搜索,只留下选项卡。
到目前为止,我在 LinearLayout 中的 recyclerview 上方有一个工具栏,该工具栏用作操作栏,而不是独立的。
我不知道如何拦截recyclerview上的触摸事件并使其缩小工具栏,然后将滚动事件返回给recyclerview。我试着把整个东西放在一个滚动视图中,但是recyclerview无法正确计算它的高度并且没有显示任何内容。我尝试在 recyclerview 上覆盖 onscroll,发现它只会在滚动事件开始时通知我,并为我提供第一个可见的卡片 ID。
看起来正确的方式,但我无法为我的生活工作,是这样的:
getSupportActionBar().setHideOnContentScrollEnabled(true);
返回:
Caused by: java.lang.UnsupportedOperationException: Hide on content scroll is not supported in this action bar configuration.
使用传统的操作栏,在其下方放置一个工具栏,并设置 hideoncontentscrollenabled 也不起作用,滚动永远不会触发操作栏上的隐藏方法。
-- 编辑 -- 我能够让 hideOnContentScrollEnabled 在带有传统操作栏的列表视图上工作,但行为与联系人应用程序不同。这显然不是他们使用的方法——它只是在列表视图上发生 fling 事件时触发操作栏上的 .hide() ,这与联系人应用程序明显不同,后者将工具栏与滚动事件一起拖动。 - /编辑 -
所以我放弃了那条路线,并将 fill_parent 放在卡片视图的高度上,并在工具栏上设置了一个折叠动画。但是如何触发它,使其跟随触摸事件,然后将触摸事件返回给recyclerview?
activity_main.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/actionBarSize"
android:background="@color/colorPrimary"
/>
<fragment android:name="me.myapplication.FragmentTab"
android:id="@+id/tab_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
片段布局.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="8dp"
android:background="#eeeeee"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
样式.xml
...
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
MainActivity.java
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
// Disable the logo in the actionbar, as per material guidelines
toolbar.getMenu().clear();
toolbar.setTitle("My toolbar");
setSupportActionBar(toolbar);