F.A.B隐藏,但不显示
试图实施Floating Action Button
(F.A.B)隐藏向下滚动,并显示在向上滚动。F.A.B隐藏,但不显示
我有ScrollAwareFABBehavior.java
来管理这个,它连接到XML中的F.A.B activity_main
。 问题: F.A.B隐藏向下滚动,但当我向上滚动时不再显示。我记录了onNestedScroll
方法,它在向下滚动时调用“调用滚动”和“调用以隐藏”;但在F.A.B隐藏后,没有任何3x Log
的
问:为什么F.A.B在隐藏F.A.B后向上滚动时不显示。
ScrollAwareFABBehavior.java:
import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {
public ScrollAwareFABBehavior(Context context, AttributeSet attrs) {
super();
}
@Override
public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,
final View directTargetChild, final View target, final int nestedScrollAxes) {
// Ensure we react to vertical scrolling
return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL
|| super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
}
@Override
public void onNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,
final View target, final int dxConsumed, final int dyConsumed,
final int dxUnconsumed, final int dyUnconsumed) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
Log.d("test", "calling scroll");
if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) {
// User scrolled down and the FAB is currently visible -> hide the FAB
Log.d("test", "calling to hide");
child.hide();
} else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) {
// User scrolled up and the FAB is currently not visible -> show the FAB
Log.d("test", "calling to show");
child.show();
}
}
}
activity_main.xml中:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="companyname.appname.MainActivity">
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rv_contactlist"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingBottom="16dp"
android:paddingTop="16dp"
android:scrollbars="vertical" />
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:src="@drawable/ic_add_circle_outline_black_24dp"
app:layout_anchor="@id/rv_contactlist"
app:layout_anchorGravity="bottom|right|end"
android:layout_alignParentEnd="true"
app:fabSize="normal"
android:layout_alignParentBottom="true"
android:onClick="addItem"
app:layout_behavior="companyname.appname.ScrollAwareFABBehavior"/>
</android.support.design.widget.CoordinatorLayout>
支持库版本,你在你的项目中使用?
如果您使用最新的(我的意思是25.0.x),这是因为fab.hide()方法将可见性设置为View.GONE。这使嵌套的滚动监听器停止检查fab,第二次尝试滚动列表。
更多细节可以在这里找到:https://code.google.com/p/android/issues/detail?id=230298
而且我搜索了一下发现这个类似的问题已经有了一个很好的答案: Floating action button not visible on scrolling after updating Google Support & Design Library
所以,一个可能的解决办法是重写fab.hide方法,不要将可见性设置为GONE而是INVISIBLE。
而且我认为这可能会从上游得到修复,所以请留意一下。
使用前面建议的双重检查方法。一个晶圆厂可以同时显示和隐形,以便完美地显示晶圆厂:
fab.show(); fab.setVisibility(View.VISIBLE);
由于Android对25.0.x更新+你应该设置与听众晶圆厂按钮隐身可再次显示晶圆厂按钮,我的解决办法是下一个:
public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {
private static final String TAG = "ScrollAwareFABBehavior";
public ScrollAwareFABBehavior(Context context, AttributeSet attrs) {
super();
}
@Override
public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull FloatingActionButton child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) {
return true;
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
if(dependency instanceof RecyclerView)
return true;
return false;
}
@Override
public void onNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull FloatingActionButton child, @NonNull View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type);
if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) {
child.hide(new FloatingActionButton.OnVisibilityChangedListener() {
@Override
public void onHidden(FloatingActionButton fab) {
super.onHidden(fab);
fab.setVisibility(View.INVISIBLE);
}
}
);
} else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) {
child.show();
}
}
}
**测试在一台Nexus 6P与Android奥利奥。
您是否尝试过使用这个方法http://stackoverflow.com/questions/32038332/using-google-design-library-how-to-hide-fab-button-on-scroll-down? –
我认为'child.hide();'现在将视图设置为'GONE'而不是'INVISIBLE',所以这段代码不起作用。检查'.hide()'确实做了什么... –
@MarkKeen我可以用什么来代替? –