0

我的布局与本教程完全相同。但在本教程中,我们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();
4

2 回答 2

2

您遵循的示例非常不走运。inside 的默认行为是FloatingActionButtonCoordinatorLayout显示时向上移动SnackBar。由于此代码覆盖了Behavior您失去此功能,因为这些方法从不调用它们的超类实现。显然作者没有考虑到这一点。但是,您可以修改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 存储库中的类,我自己编写了相同的代码并想对其进行测试后才找到它。他们只是忘记更新博客文章:-/

于 2015-07-29T12:27:49.937 回答
0

你试过这个吗?

...
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()方法。

于 2015-07-29T12:28:57.370 回答