如何将简单按钮锚定到小吃店
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;
}
我有按钮而不是浮动操作按钮我想用小吃栏锚定它,因为它用浮动操作栏锚定,就像浮动操作按钮在显示小吃栏时向上移动,使用浮动操作栏我们这样做:
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;
}