Android 是否可以将协调布局与约束布局相结合?

Android 是否可以将协调布局与约束布局相结合?,android,android-constraintlayout,android-coordinatorlayout,Android,Android Constraintlayout,Android Coordinatorlayout,在我的一个视图中,我在主视图的底部有一个ConstraintLayout,里面有三个ImageButton。我还使用一个Snackbar在底部显示一些信息。如果Snackbar可见,我想将整个约束向上移动。我现在尝试了不同的东西,但没有任何结果。在一个单独的Android项目中,我对CoordinatorLayouts做了一点研究,到目前为止,我的结果是,约束是不可能的。我的假设正确吗 这是有效的 public class CustomBehaviourButton extends Coordi

在我的一个视图中,我在主视图的底部有一个ConstraintLayout,里面有三个ImageButton。我还使用一个Snackbar在底部显示一些信息。如果Snackbar可见,我想将整个约束向上移动。我现在尝试了不同的东西,但没有任何结果。在一个单独的Android项目中,我对CoordinatorLayouts做了一点研究,到目前为止,我的结果是,约束是不可能的。我的假设正确吗

这是有效的

public class CustomBehaviourButton extends CoordinatorLayout.Behavior<Button>{

    public CustomBehaviourButton() {
    }

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

    @Override
    public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull Button child, @NonNull View dependency) {
        return dependency instanceof Snackbar.SnackbarLayout;
    }

    @Override
    public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull Button child, @NonNull View dependency) {
        float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
        child.setTranslationY(translationY);
        return true;
    }

    @Override
    public void onDependentViewRemoved(@NonNull CoordinatorLayout parent, @NonNull Button child, @NonNull View dependency) {
        float translationY = Math.min(0, dependency.getTranslationY() + dependency.getHeight());
        child.setTranslationY(translationY);
    }
}
公共类CustomBehavior按钮扩展了CoordinatorLayout.Behavior{
公共自定义按钮(){
}
公共自定义行为按钮(上下文、属性集属性){
超级(上下文,attrs);
}
@凌驾
公共布尔布局依赖项(@NonNull CoordinatorLayout父项、@NonNull按钮子项、@NonNull视图依赖项){
返回Snackbar.Snackbar布局的依赖实例;
}
@凌驾
公共布尔onDependentViewChanged(@NonNull CoordinatorLayout父级、@NonNull按钮子级、@NonNull视图依赖项){
float translationY=Math.min(0,dependency.getTranslationY()-dependency.getHeight());
child.setTranslationY(translationY);
返回true;
}
@凌驾
删除了OnDependentViewPublic void(@NonNull CoordinatorLayout parent、@NonNull Button child、@NonNull View dependency){
float translationY=Math.min(0,dependency.getTranslationY()+dependency.getHeight());
child.setTranslationY(translationY);
}
}
这是行不通的

public class CustomBehaviourConstraintLayout extends CoordinatorLayout.Behavior<ConstraintLayout> {

    public CustomBehaviourConstraintLayout() {
    }

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

    @Override
    public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull ConstraintLayout child, @NonNull View dependency) {
        return dependency instanceof Snackbar.SnackbarLayout;
    }

    @Override
    public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull ConstraintLayout child, @NonNull View dependency) {
        float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
        child.setTranslationY(translationY);
        return true;
    }

    @Override
    public void onDependentViewRemoved(@NonNull CoordinatorLayout parent, @NonNull ConstraintLayout child, @NonNull View dependency) {
        float translationY = Math.min(0, dependency.getTranslationY() + dependency.getHeight());
        child.setTranslationY(translationY);
    }
}
公共类CustomBehaviorConstraintLayout扩展了CoordinatorLayout.Behavior{
公共CustomBehaviorConstraintLayout(){
}
公共CustomBehaviorConstraintLayout(上下文上下文、属性集属性){
超级(上下文,attrs);
}
@凌驾
公共布尔布局依赖项(@NonNull CoordinatorLayout parent、@NonNull ConstraintLayout child、@NonNull View dependency){
返回Snackbar.Snackbar布局的依赖实例;
}
@凌驾
公共布尔值onDependentViewChanged(@NonNull CoordinatorLayout parent、@NonNull ConstraintLayout child、@NonNull View dependency){
float translationY=Math.min(0,dependency.getTranslationY()-dependency.getHeight());
child.setTranslationY(translationY);
返回true;
}
@凌驾
删除了OnDependentViewPublic void(@NonNull CoordinatorLayout parent、@NonNull ConstraintLayout child、@NonNull View dependency){
float translationY=Math.min(0,dependency.getTranslationY()+dependency.getHeight());
child.setTranslationY(translationY);
}
}
如果显示Snackbar,ConstraintLayout是否有可能做出反应

编辑:

这是我目前的布局



我只希望第二个约束受到行为的影响。我只在第一次试用时得到它,但结果不是我想要的。

花了一段时间,但我找到了解决我问题的方法,我想这个方法对其他人很有帮助

诀窍是深入挖掘定制行为类。看起来最外层的人需要获得Bahviour。在这种情况下,我只是引用了onDependendViewChanged中最内部的ConstraintLayout,以仅修改布局的这一部分

@Override
    public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull ConstraintLayout child, @NonNull View dependency) {
        ConstraintLayout mainControlsPanel = child.findViewById(R.id.mainControlsPanel);

        float heightDiff = dependency.getY() - mainControlsPanel.getY();
        float translationY = heightDiff - mainControlsPanel.getHeight() - MARGIN;

        mainControlsPanel.setTranslationY(translationY);

        return true;
    }

您应该尝试模拟
FloatingActionButton
行为到您的
ConstraintLayout
,因为每当Snackbar在协调器布局中显示时,如果有FAB,它就会向上移动。