Coordinator layout custom layout behavior never getting called

后端 未结 2 557
醉话见心
醉话见心 2020-12-14 02:02

Firstly, I\'d like to preface this with my lack of knowledge about the coordinator layout. I\'m merely following tutorials I found online and am curious why my behavior isn\

相关标签:
2条回答
  • 2020-12-14 02:12

    The reason why it is not working is that view with Behavior must be a direct child of CoordinatorLayout. In your case, the hierarchy is: CoordinatorLayout -> RelativeLayout -> LinearLayout (with Behavior).

    0 讨论(0)
  • 2020-12-14 02:32

    I have a layout such as this. There are a few things located in the upper regions, but the bottom contains only a FAB which is deeply nested.

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/your_coordinator_id">
    
        <android.support.constraint.ConstraintLayout
            app:layout_behavior="com.yourpackage.YourBehavior">
    
            <ScrollView>
                ...
            </ScrollView>
    
            <android.support.design.widget.TextInputLayout>
                ...
            </android.support.design.widget.TextInputLayout>
    
            <android.support.design.widget.TextInputLayout>
                ...
            </android.support.design.widget.TextInputLayout>
    
            <!--
                Everything "around" the FAB needs to be moved.
            -->
            <RelativeLayout
                android:id="@+id/your_view_id">
    
               <com.github.jorgecastilloprz.FABProgressCircle>
    
                    <!--
                       This is the actual FAB.
                    -->
                    <android.support.design.widget.FloatingActionButton/>
                </com.github.jorgecastilloprz.FABProgressCircle>
            </RelativeLayout>
        </android.support.constraint.ConstraintLayout>
    </android.support.design.widget.CoordinatorLayout>
    

    The FAB is deeply nested.

    CoordinatorLayout > ConstraintLayout > RelativeLayout > FABProgressCircle > FAB

    However the RelativeLayout needs to be pushed up by the CoordinatorLayout when the Snackbar is shown.

    The behavior which will do this is as simple as follows.

    package com.yourpackage;
    
    ...
    
    public class YourBehavior extends CoordinatorLayout.Behavior<ConstraintLayout> {
    
        public YourBehavior(Context context, AttributeSet attrs) {
        }
    
        @Override
        public boolean onDependentViewChanged(CoordinatorLayout parent, ConstraintLayout child, View dependency) {
            float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
            // Note that the RelativeLayout gets translated.
            child.findViewById(R.id.your_view_id).setTranslationY(translationY);
            return true;
        }
    
        @Override
        public void onDependentViewRemoved(CoordinatorLayout parent, ConstraintLayout child, View dependency) {
            child.findViewById(R.id.your_view_id).setTranslationY(0.0f);
        }
    
        @Override
        public boolean layoutDependsOn(CoordinatorLayout parent, ConstraintLayout child, View dependency) {
            return dependency instanceof Snackbar.SnackbarLayout;
        }
    }
    

    Show the Snackbar like this.

    Snackbar.make(findViewById(R.id.your_coordinator_id), "Message", Snackbar.LENGTH_SHORT).show();
    

    onDependentViewRemoved needs to be overridden, because when manually dismissing a Snackbar the CoordinatorLayout won't trigger moving the translated View (the FloatingActionButton and its RelativeLayout) back to it's original place. Overriding the method we can translate it back to where it was.

    0 讨论(0)
提交回复
热议问题