Need to disable expand on CollapsingToolbarLayout for certain fragments

前端 未结 14 1346
萌比男神i
萌比男神i 2020-11-28 08:55

I have a AppCompatActivity that controls replacing many fragments. Here is my layout for it.

activity_main.xml



        
14条回答
  •  生来不讨喜
    2020-11-28 09:43

    I can't comment, so I will post my additions to JasonWyatt's DisableableAppBarLayoutBehavior solution as independent answer.

    public class DisableableAppBarLayoutBehavior extends AppBarLayout.Behavior {
        private boolean mEnabled = true; // enabled by default
    
        public DisableableAppBarLayoutBehavior() {
            super();
        }
    
        public DisableableAppBarLayoutBehavior(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public void setEnabled(boolean enabled) {
            mEnabled = enabled;
        }
    
        @Override
        public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes, int type) {
            return mEnabled && super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes, type);
        }
    
        @Override
        public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) {
            if (!isEnabled()) return;
            super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type);
        }
    
        @Override
        public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) {
            if (!isEnabled()) return;
            super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
        }
    
        public boolean isEnabled() {
            return mEnabled;
        }
    }
    

    In addition to onStartNestedScroll also lock onNestedPreScroll and onNestedScroll itself to avoid unexpected behaviour. For example, in my case - calling setExpanded(false, true) on my app bar was braking expected behaviour and still was expanding with lags. Now it works:

    LayoutParams layoutParams = (LayoutParams) context.appBarLayout.getLayoutParams();
    ((DisableableAppBarLayoutBehavior)layoutParams.getBehavior()).setEnabled(false);
    context.appBarLayout.setLayoutParams(layoutParams);
    context.appBarLayout.setExpanded(false, true); // collapse app bar
    

提交回复
热议问题