显示 SnackBar 时,按钮必须充当 FAB
Button has to act as FAB when the SnackBar is shown
我想要实现的是在 CoordinatorLayout
中有一个 Button
容器
android.support.design.widget.CoordinatorLayout
android.widget.button
对 SnackBar 的反应类似于 FloatingActionButton
。
那个使用 FloatingActionButton
.
扩展 CoordinatorLayout.Behavior<FloatingActionButton>
.
的行为
我是否必须自己定义自定义行为,或者是否有任何通用组件以相同的方式做出反应?
您可以定义自己的布局和自定义 CoordinatorLayout.Behavior
您可以克隆 FloatingActionButton
结构。
类似于:
@CoordinatorLayout.DefaultBehavior(ButtonLayout.Behavior.class)
public class ButtonLayout extends LinearLayout {
public static class Behavior extends
android.support.design.widget.CoordinatorLayout.Behavior<ButtonLayout> {
public boolean layoutDependsOn(CoordinatorLayout parent, ButtonLayout child, View dependency) {
return dependency instanceof Snackbar.SnackbarLayout;
}
public boolean onDependentViewChanged(CoordinatorLayout parent, ButtonLayout child, View dependency) {
if(dependency instanceof Snackbar.SnackbarLayout) {
this.updateFabTranslationForSnackbar(parent, child, dependency);
}
return false;
}
private void updateFabTranslationForSnackbar(CoordinatorLayout parent, ButtonLayout fab, View snackbar) {
//copy from FloatingActionButton.Behavior
}
}
}
你应该自己定制CoordinatorLayout.Behavior
import android.content.Context
import android.util.AttributeSet
import android.view.View
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.google.android.material.snackbar.Snackbar
class SnackbarAwareBehaviour(context: Context, attrs: AttributeSet)
: CoordinatorLayout.Behavior<View>(context, attrs) {
override fun layoutDependsOn(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
return dependency is Snackbar.SnackbarLayout
}
override fun onDependentViewChanged(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
child.translationY = Math.min(0f, dependency.translationY - dependency.height)
return true
}
override fun onDependentViewRemoved(parent: CoordinatorLayout, child: View, dependency: View) {
child.translationY = 0f
}
}
并且您必须使用以下两种方法之一将该行为分配给 CoordinatorLayout 的任何直接子视图
1- 通过使用 layout_behavior
自定义 CoordinatorLayout
属性
<androidx.coordinatorlayout.widget.CoordinatorLayout
...>
...
<!-- The view which has the Behaviour should be a direct child to the CoordinatorLayout -->
<Button
...
app:layout_behavior="my.package.SnackbarAwareBehaviour"
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
2 - 或者您也可以通过实现 CoordinatorLayout.AttachedBehavior 接口
将行为分配给您自己的自定义视图
class MyButton(context: Context, attrs: AttributeSet?)
: Button(context, attrs), CoordinatorLayout.AttachedBehavior {
...
override fun getBehavior(): CoordinatorLayout.Behavior<*> {
return SnackbarAwareBehaviour(context, null)
}
}
我想要实现的是在 CoordinatorLayout
Button
容器
android.support.design.widget.CoordinatorLayout
android.widget.button
对 SnackBar 的反应类似于 FloatingActionButton
。
那个使用 FloatingActionButton
.
扩展 CoordinatorLayout.Behavior<FloatingActionButton>
.
我是否必须自己定义自定义行为,或者是否有任何通用组件以相同的方式做出反应?
您可以定义自己的布局和自定义 CoordinatorLayout.Behavior
您可以克隆 FloatingActionButton
结构。
类似于:
@CoordinatorLayout.DefaultBehavior(ButtonLayout.Behavior.class)
public class ButtonLayout extends LinearLayout {
public static class Behavior extends
android.support.design.widget.CoordinatorLayout.Behavior<ButtonLayout> {
public boolean layoutDependsOn(CoordinatorLayout parent, ButtonLayout child, View dependency) {
return dependency instanceof Snackbar.SnackbarLayout;
}
public boolean onDependentViewChanged(CoordinatorLayout parent, ButtonLayout child, View dependency) {
if(dependency instanceof Snackbar.SnackbarLayout) {
this.updateFabTranslationForSnackbar(parent, child, dependency);
}
return false;
}
private void updateFabTranslationForSnackbar(CoordinatorLayout parent, ButtonLayout fab, View snackbar) {
//copy from FloatingActionButton.Behavior
}
}
}
你应该自己定制CoordinatorLayout.Behavior
import android.content.Context
import android.util.AttributeSet
import android.view.View
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.google.android.material.snackbar.Snackbar
class SnackbarAwareBehaviour(context: Context, attrs: AttributeSet)
: CoordinatorLayout.Behavior<View>(context, attrs) {
override fun layoutDependsOn(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
return dependency is Snackbar.SnackbarLayout
}
override fun onDependentViewChanged(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
child.translationY = Math.min(0f, dependency.translationY - dependency.height)
return true
}
override fun onDependentViewRemoved(parent: CoordinatorLayout, child: View, dependency: View) {
child.translationY = 0f
}
}
并且您必须使用以下两种方法之一将该行为分配给 CoordinatorLayout 的任何直接子视图
1- 通过使用 layout_behavior
自定义 CoordinatorLayout
属性
<androidx.coordinatorlayout.widget.CoordinatorLayout
...>
...
<!-- The view which has the Behaviour should be a direct child to the CoordinatorLayout -->
<Button
...
app:layout_behavior="my.package.SnackbarAwareBehaviour"
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
2 - 或者您也可以通过实现 CoordinatorLayout.AttachedBehavior 接口
将行为分配给您自己的自定义视图class MyButton(context: Context, attrs: AttributeSet?)
: Button(context, attrs), CoordinatorLayout.AttachedBehavior {
...
override fun getBehavior(): CoordinatorLayout.Behavior<*> {
return SnackbarAwareBehaviour(context, null)
}
}