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

时间:2018-06-01 06:42:31

标签: java android android-button android-snackbar floating-action-button

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

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

如何使用简单的按钮作为零食栏和按钮不知道零食栏的存在,反之亦然并独立移动

由于

2 个答案:

答案 0 :(得分:1)

文档说这个

  

在视图层次结构中使用CoordinatorLayout允许Snackbar启用某些功能,例如滑动到关闭和自动移动小部件,如FloatingActionButton。

因此,只要您的按钮直接位于协调器布局下,并将按钮传递给Snackbar,就像这样

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

答案 1 :(得分:0)

您必须将Behavior附加到要与View移动一起移动的Snakebar

在这里,我制作了一个自定义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,使用阴影填充,显示/隐藏基于AppBarLayout运动的更多内容。 CoordinatorLayout中的每个移动都基于其Behavior机制

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

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

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;
}