如何将简单按钮锚定到小吃店

How to anchor simple button to snackbar

我有按钮而不是浮动操作按钮我想用小吃栏锚定它,因为它用浮动操作栏锚定,就像浮动操作按钮在显示小吃栏时向上移动,使用浮动操作栏我们这样做:

Snackbar.make(fab, s, Snackbar.LENGTH_SHORT);

我如何处理简单的按钮,因为 snackbar 和按钮不知道 snackbar 的存在,反之亦然并且独立移动

谢谢

文档是这样说的

Having a CoordinatorLayout in your view hierarchy allows Snackbar to enable certain features, such as swipe-to-dismiss and automatically moving of widgets like FloatingActionButton.

所以只要你的按钮直接在 Coordinator Layout 下并且像这样将按钮传递给 Snackbar

Snackbar.make(yourButton, s, Snackbar.LENGTH_SHORT);。向上移动小部件应该有效。

您必须将 Behavior 附加到您想要随着 Snakebar 移动 Snakebar 移动的 View

在这里我做了一个自定义 View 并将行为附加到它

@CoordinatorLayout.DefaultBehavior(CustomView.Behavior.class)
public class CustomView extends View {
    public CustomView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public static class Behavior extends CoordinatorLayout.Behavior<CustomView> {

        public Behavior() {
            super();
        }

        public Behavior(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        @Override
        public void onAttachedToLayoutParams(@NonNull CoordinatorLayout.LayoutParams lp) {
            if (lp.dodgeInsetEdges == Gravity.NO_GRAVITY) {
                // This setting makes it works (learn from FloatingActionButton.Behavior)
                lp.dodgeInsetEdges = Gravity.BOTTOM;
            }
        }

        @Override
        public boolean onDependentViewChanged(CoordinatorLayout parent, CustomView child,
                                              View dependency) {
            return false;
        }
    }
}

在您的布局中使用此 CustomView,它应该可以工作

FloatingActionButton 做同样的事情,它有一个内部 Behavior 可以用阴影填充做更多的事情,show/hide 基于 AppBarLayout 移动。 CoordinatorLayout 中的每个动作都基于其 Behavior 机制

参考此处:http://saulmm.github.io/mastering-coordinator

P/S:关于Snakebar.make用法,将CoordinatorLayout传入view参数,不要传入任何其他参数组件,这将节省系统性能。如果您查看 Snakebar 代码,它有一个循环,使用视图参数来查找根视图。根视图是它想要的:

private static ViewGroup findSuitableParent(View view) {
    ViewGroup fallback = null;
    do {
        if (view instanceof CoordinatorLayout) {
            // We've found a CoordinatorLayout, use it
            return (ViewGroup) view;
        } else if (view instanceof FrameLayout) {
            if (view.getId() == android.R.id.content) {
                // If we've hit the decor content view, then we didn't find a CoL in the
                // hierarchy, so use it.
                return (ViewGroup) view;
            } else {
                // It's not the content view but we'll use it as our fallback
                fallback = (ViewGroup) view;
            }
        }

        if (view != null) {
            // Else, we will loop and crawl up the view hierarchy and try to find a parent
            final ViewParent parent = view.getParent();
            view = parent instanceof View ? (View) parent : null;
        }
    } while (view != null);

    // If we reach here then we didn't find a CoL or a suitable content view so we'll fallback
    return fallback;
}