SnackBar 覆盖 FAB
SnackBar covers FAB
我的布局与this tutorial完全相同。但在本教程中我们使用 app:layout_behavior="pl.michalz.hideonscrollexample.ScrollingFABBehavior"
在 Fab XML 中,因此 SnackBar
覆盖了 Fab。如果没有此代码,Fab 不会移动,后面跟着 RecyclerView
。如何正确显示SnackBar
?
Snackbar.make(getActivity().findViewById(R.id.coordinatorLayout),
adapter.getNewsList().get(position).getTitle(), Snackbar.LENGTH_LONG).show();
你效仿的例子很不幸。 CoordinatorLayout
中 FloatingActionButton
的默认行为是在显示 SnackBar
时向上移动。由于这段代码覆盖了 Behavior
你失去了这个特性,因为这些方法从不调用它们的超级 class 实现。显然作者没有考虑到这一点。但是,您可以修改 ScrollingFABBehavior
以扩展原始 Behavior
从而支持 SnackBar
:
public class ScrollingFABBehavior extends FloatingActionButton.Behavior {
private int toolbarHeight;
public ScrollingFABBehavior(Context context, AttributeSet attrs) {
super();
this.toolbarHeight = Utils.getToolbarHeight(context);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
return super.layoutDependsOn(parent, fab, dependency) || (dependency instanceof AppBarLayout);
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
boolean returnValue = super.onDependentViewChanged(parent, fab, dependency);
if (dependency instanceof AppBarLayout) {
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
int fabBottomMargin = lp.bottomMargin;
int distanceToScroll = fab.getHeight() + fabBottomMargin;
float ratio = (float)dependency.getY()/(float)toolbarHeight;
fab.setTranslationY(-distanceToScroll * ratio);
}
return returnValue;
}
}
这实际上是示例 github repository 中的 class,我自己编写了相同的代码并想对其进行测试后才发现它。他们只是忘了更新博客 post :-/
你试过吗?
...
View view = inflater.inlfate(R.layout.my_layout, parent, false);
...
Snackbar.make(view.findViewById(R.id.fab),
adapter.getNewsList().get(position).getTitle(), Snackbar.LENGTH_LONG).show();
...
return view;
我假设你在Fragment
中调用上面的代码,所以我添加了view
变量来调用findViewById()
方法。
我的布局与this tutorial完全相同。但在本教程中我们使用 app:layout_behavior="pl.michalz.hideonscrollexample.ScrollingFABBehavior"
在 Fab XML 中,因此 SnackBar
覆盖了 Fab。如果没有此代码,Fab 不会移动,后面跟着 RecyclerView
。如何正确显示SnackBar
?
Snackbar.make(getActivity().findViewById(R.id.coordinatorLayout),
adapter.getNewsList().get(position).getTitle(), Snackbar.LENGTH_LONG).show();
你效仿的例子很不幸。 CoordinatorLayout
中 FloatingActionButton
的默认行为是在显示 SnackBar
时向上移动。由于这段代码覆盖了 Behavior
你失去了这个特性,因为这些方法从不调用它们的超级 class 实现。显然作者没有考虑到这一点。但是,您可以修改 ScrollingFABBehavior
以扩展原始 Behavior
从而支持 SnackBar
:
public class ScrollingFABBehavior extends FloatingActionButton.Behavior {
private int toolbarHeight;
public ScrollingFABBehavior(Context context, AttributeSet attrs) {
super();
this.toolbarHeight = Utils.getToolbarHeight(context);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
return super.layoutDependsOn(parent, fab, dependency) || (dependency instanceof AppBarLayout);
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
boolean returnValue = super.onDependentViewChanged(parent, fab, dependency);
if (dependency instanceof AppBarLayout) {
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
int fabBottomMargin = lp.bottomMargin;
int distanceToScroll = fab.getHeight() + fabBottomMargin;
float ratio = (float)dependency.getY()/(float)toolbarHeight;
fab.setTranslationY(-distanceToScroll * ratio);
}
return returnValue;
}
}
这实际上是示例 github repository 中的 class,我自己编写了相同的代码并想对其进行测试后才发现它。他们只是忘了更新博客 post :-/
你试过吗?
...
View view = inflater.inlfate(R.layout.my_layout, parent, false);
...
Snackbar.make(view.findViewById(R.id.fab),
adapter.getNewsList().get(position).getTitle(), Snackbar.LENGTH_LONG).show();
...
return view;
我假设你在Fragment
中调用上面的代码,所以我添加了view
变量来调用findViewById()
方法。