Toolbar下的GridView——滚动时隐藏ToolBar
GridView under Toolbar - Hide ToolBar when Scrolling
我的 Activity 布局如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/content_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include layout="@layout/toolbar" />
</FrameLayout>
content_fragment 是我替换包含 gridView 的片段的地方:
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context="com.test.android.client.fragment.BurgerGridFragment">
<GridView
android:id="@+id/grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:columnWidth="150dp"
android:horizontalSpacing="@dimen/margin_extra_small"
android:numColumns="auto_fit"
android:padding="@dimen/padding_extra_small"
android:scrollbars="none"
android:stretchMode="columnWidth"
android:verticalSpacing="@dimen/margin_extra_small" />
</android.support.v4.widget.SwipeRefreshLayout>
我的想法是,只要我在 GridView 中滚动,工具栏就应该 appears/disappears 带有动画:
if (shown) {
view.animate()
.translationY(0)
.alpha(1)
.setDuration(HEADER_HIDE_ANIM_DURATION)
.setInterpolator(new DecelerateInterpolator());
} else {
view.animate()
.translationY(-view.getBottom())
.alpha(0)
.setDuration(HEADER_HIDE_ANIM_DURATION)
.setInterpolator(new DecelerateInterpolator());
}
问题是第一个网格项与工具栏部分重叠。
你知道如何解决这个问题吗?
附录:
我已经为我的 Activity 尝试了 RelativeLayout 和 LinearLayout 而不是 FrameLayout,但这不是解决方案,我遇到了另一个问题
您可以向 GridView
添加一个空的 header,它将隐藏在您的自定义 header 下,以提供所需的间距。由于标准 GridView
不支持 header,您需要使用 HeaderGridView
。这个插件我已经用过好几次了,一直很好用。
由于您正在使用 SwipeRefreshLayout
,因此您还需要调整其进度视图位置。根据this answer this can be done with setProgressViewOffset()
.
尝试将 FrameLayout 更改为垂直方向的 LinearLayout。
然后 Gridview 将放置在工具栏下方。
我的 Activity 布局如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/content_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include layout="@layout/toolbar" />
</FrameLayout>
content_fragment 是我替换包含 gridView 的片段的地方:
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context="com.test.android.client.fragment.BurgerGridFragment">
<GridView
android:id="@+id/grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:columnWidth="150dp"
android:horizontalSpacing="@dimen/margin_extra_small"
android:numColumns="auto_fit"
android:padding="@dimen/padding_extra_small"
android:scrollbars="none"
android:stretchMode="columnWidth"
android:verticalSpacing="@dimen/margin_extra_small" />
</android.support.v4.widget.SwipeRefreshLayout>
我的想法是,只要我在 GridView 中滚动,工具栏就应该 appears/disappears 带有动画:
if (shown) {
view.animate()
.translationY(0)
.alpha(1)
.setDuration(HEADER_HIDE_ANIM_DURATION)
.setInterpolator(new DecelerateInterpolator());
} else {
view.animate()
.translationY(-view.getBottom())
.alpha(0)
.setDuration(HEADER_HIDE_ANIM_DURATION)
.setInterpolator(new DecelerateInterpolator());
}
问题是第一个网格项与工具栏部分重叠。 你知道如何解决这个问题吗?
附录:
我已经为我的 Activity 尝试了 RelativeLayout 和 LinearLayout 而不是 FrameLayout,但这不是解决方案,我遇到了另一个问题
您可以向 GridView
添加一个空的 header,它将隐藏在您的自定义 header 下,以提供所需的间距。由于标准 GridView
不支持 header,您需要使用 HeaderGridView
。这个插件我已经用过好几次了,一直很好用。
由于您正在使用 SwipeRefreshLayout
,因此您还需要调整其进度视图位置。根据this answer this can be done with setProgressViewOffset()
.
尝试将 FrameLayout 更改为垂直方向的 LinearLayout。 然后 Gridview 将放置在工具栏下方。