如何 show/hide FAB on scroll Recycler view with coordinator parent
how to show/hide FAB on scroll Recycler view with coordinator parent
我有一个 activity 和协调器 layout.inside activity 有一个带有 Recycler 视图和浮动的片段 button.how 我可以 show/hide 在滚动时浮动按钮吗回收站查看并避免使用 fab 行为?!
在activity布局中:
CoordinatorLayout----->AppBarLayout---->Toolbar and FrameLayout and Bottom bar view
在片段布局中:
RelativeLayout---->Recycler视图和浮动按钮
我想实现类似 Google+ 主页的功能。
我该如何实现这种情况?
临时我使用这个解决方案来解决我的问题:
在我的片段中通过界面使用 activity 的协调器布局和 show/hide 具有 fab 行为的 fab ......直到我找到更好的解决方案!!!
此代码工作正常:
mRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if(dy > 0){
mFab.hide();
} else{
mFab.show();
}
super.onScrolled(recyclerView, dx, dy);
}
});
你不能这样做:
app:layout_anchor="@id/listView"
app:layout_anchorGravity="bottom|end"
看here:
There is no support built-in for CoordinatorLayout to work with
ListView according to this Google post.
我修改了 Leondro 的方法,使 FAB 在滚动时隐藏并在滚动停止时显示。
scrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE:
fab.show();
break;
default:
fab.hide();
break;
}
super.onScrollStateChanged(recyclerView, newState);
}
};
rv.clearOnScrollListeners();
rv.addOnScrollListener(scrollListener);
这是可行的解决方案:
class HideOnScrollFabBehavior(context: Context?, attrs: AttributeSet?) : FloatingActionButton.Behavior() {
// changes visibility from GONE to INVISIBLE when fab is hidden because
// due to CoordinatorLayout.onStartNestedScroll() implementation
// child view's (here, fab) onStartNestedScroll won't be called anymore
// because it's visibility is GONE
private val listener = object : FloatingActionButton.OnVisibilityChangedListener() {
override fun onHidden(fab: FloatingActionButton?) {
fab?.visibility = INVISIBLE
}
}
override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton, directTargetChild: View, target: View, axes: Int, type: Int): Boolean {
return axes == ViewCompat.SCROLL_AXIS_VERTICAL // Ensure we react to vertical scrolling
|| super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type)
}
override fun onNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton, target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, type: Int, consumed: IntArray) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type, consumed)
if (!target.canScrollVertically(1) && dyConsumed > 0 && child.visibility == VISIBLE) {
// hide the FAB when scroll view reached its bottom
child.hide(listener)
} else if (dyConsumed < 0 && child.visibility != VISIBLE) {
// show the FAB on scroll up
child.show()
}
}
}
将此添加到 FAB:
应用:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
Kotlin 中的解决方案
recycler_view = findViewById(R.id.recycler_view)
recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener(){
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
if(dy > 0){
fab.hide();
} else{
fab.show();
}
super.onScrolled(recyclerView, dx, dy)
}
})
我有一个 activity 和协调器 layout.inside activity 有一个带有 Recycler 视图和浮动的片段 button.how 我可以 show/hide 在滚动时浮动按钮吗回收站查看并避免使用 fab 行为?!
在activity布局中: CoordinatorLayout----->AppBarLayout---->Toolbar and FrameLayout and Bottom bar view
在片段布局中: RelativeLayout---->Recycler视图和浮动按钮
我想实现类似 Google+ 主页的功能。 我该如何实现这种情况?
临时我使用这个解决方案来解决我的问题:
在我的片段中通过界面使用 activity 的协调器布局和 show/hide 具有 fab 行为的 fab ......直到我找到更好的解决方案!!!
此代码工作正常:
mRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if(dy > 0){
mFab.hide();
} else{
mFab.show();
}
super.onScrolled(recyclerView, dx, dy);
}
});
你不能这样做:
app:layout_anchor="@id/listView"
app:layout_anchorGravity="bottom|end"
看here:
There is no support built-in for CoordinatorLayout to work with ListView according to this Google post.
我修改了 Leondro 的方法,使 FAB 在滚动时隐藏并在滚动停止时显示。
scrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE:
fab.show();
break;
default:
fab.hide();
break;
}
super.onScrollStateChanged(recyclerView, newState);
}
};
rv.clearOnScrollListeners();
rv.addOnScrollListener(scrollListener);
这是可行的解决方案:
class HideOnScrollFabBehavior(context: Context?, attrs: AttributeSet?) : FloatingActionButton.Behavior() {
// changes visibility from GONE to INVISIBLE when fab is hidden because
// due to CoordinatorLayout.onStartNestedScroll() implementation
// child view's (here, fab) onStartNestedScroll won't be called anymore
// because it's visibility is GONE
private val listener = object : FloatingActionButton.OnVisibilityChangedListener() {
override fun onHidden(fab: FloatingActionButton?) {
fab?.visibility = INVISIBLE
}
}
override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton, directTargetChild: View, target: View, axes: Int, type: Int): Boolean {
return axes == ViewCompat.SCROLL_AXIS_VERTICAL // Ensure we react to vertical scrolling
|| super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type)
}
override fun onNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton, target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, type: Int, consumed: IntArray) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type, consumed)
if (!target.canScrollVertically(1) && dyConsumed > 0 && child.visibility == VISIBLE) {
// hide the FAB when scroll view reached its bottom
child.hide(listener)
} else if (dyConsumed < 0 && child.visibility != VISIBLE) {
// show the FAB on scroll up
child.show()
}
}
}
将此添加到 FAB:
应用:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
Kotlin 中的解决方案
recycler_view = findViewById(R.id.recycler_view)
recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener(){
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
if(dy > 0){
fab.hide();
} else{
fab.show();
}
super.onScrolled(recyclerView, dx, dy)
}
})