我正在使用这个库来实现浮动操作栏,但当Snackbar出现在屏幕上时,我无法找到移动按钮的方法。使用该库是否可能实现?
对于未来需要答案的任何人...
将协调布局(Coordinator Layout)作为浮动操作按钮(Floating Action Button)的父布局,会自动处理动画效果。
浮动操作按钮有一个默认行为,可以检测到添加的 Snackbar 视图,并相应地在 Snackbar 的高度以上动画显示该按钮。
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/clayout">
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_marginBottom="16dp"
android:layout_marginRight="16dp"
android:src="@drawable/filter_icon"
app:rippleColor="@color/colorGray"
app:fabSize="normal"
app:borderWidth="0dp"/>
</android.support.design.widget.CoordinatorLayout>
接下来我们的 SnackBar 代码将使用 CoordinatorLayout [这里是 clayout] 作为父布局,代码如下:
Snackbar.make(clayout, "Click on row to know more details", Snackbar.LENGTH_LONG)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}).show();
尝试使用android.support.design.widget.FloatingActionButton
和CoordinatorLayout
。
然后尝试这样做:
fabView = findViewById(R.id.floating_action_button_id);
Snackbar.make(fabView, "Hi", Snackbar.LENGTH_LONG).show()
CoordinatorLayout是一个超级强大的FrameLayout。
CoordinatorLayout主要用于以下两种情况:
- 作为应用程序装饰或Chrome布局的顶层布局
- 作为一个或多个子视图特定交互的容器
通过为CoordinatorLayout的子视图指定Behaviors,您可以在单个父级中提供许多不同的交互,并且这些视图也可以相互交互。当作为CoordinatorLayout的子项使用时,视图类可以使用DefaultBehavior注释指定默认行为。
行为可用于实现各种交互和附加布局修改,从滑动抽屉和面板到可滑动删除的元素和按钮,这些按钮会随着移动和动画而粘附到其他元素上。
CoordinatorLayout的子项可能具有锚点。此视图ID必须对应于CoordinatorLayout的任意后代,但它不能是锚定的子项本身或锚定子项的后代。这可用于将浮动视图相对于其他任意内容窗格放置。
Kotlin:
class CustomBehavior : CoordinatorLayout.Behavior<FloatingActionButton> {
....
override fun onAttachedToLayoutParams(params: CoordinatorLayout.LayoutParams) {
super.onAttachedToLayoutParams(params)
//set dodgeInsetEdges to BOTTOM so that we dodge any Snackbars
params.dodgeInsetEdges = Gravity.BOTTOM
}
.....
}
app:layout_dodgeInsetEdges="bottom"
。该属性将使视图避让屏幕底部的导航栏或系统UI。 - Slav您可以使用 FAB 作为 parentLayout。
Snackbar.make(parentLayout, R.string.snackbar_text,Snackbar.LENGTH_LONG).setAction(R.string.snackbar_action, myOnClickListener).show();
fab.animate().translationYBy(-snackbar.getHeight())
,当它被隐藏时,使用相同的东西,只是在getHeight()
之前省略负号。这有点 hacky,因为可能会发生的情况是用户在初始按钮按下后继续按按钮,浮动按钮会不断向上移动。我只是使用了一些布尔逻辑来标记按钮的当前状态作为一种解决方法。 - naja