How can i determine that CollapsingToolbar is collapsed?

后端 未结 5 1741
萌比男神i
萌比男神i 2020-12-04 16:26

I need to know when CollapsingToolbar from material design library is collapsed.

相关标签:
5条回答
  • 2020-12-04 17:04

    UPDATE: Since support versions of 23.1.1+ the issue is no longer there, no need to use the listener and disable the swipe refresh layout, it will work as it should (link).


    Implement AppBarLayout.OnOffsetChangedListener listener on your AppBarLayout

    AppBarLayout appBarLayout = (AppBarLayout) view.findViewById(R.id.app_bar_layout);
    appBarLayout.addOnOffsetChangedListener(this);
    

    And check if offset is 0, meaning the toolbar is fully expanded.

    @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int offset)
    {
        if (offset == 0)
        {
            // Fully expanded
        }
        else
        {
            // Not fully expanded or collapsed
        }
    }
    
    0 讨论(0)
  • 2020-12-04 17:04

    As Marko said, this can be achieved using your own implementation of a OnOffsetChangedListener.

    AppBarLayout appBarLayout = (AppBarLayout) view.findViewById(R.id.app_bar_layout);
    appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (Math.abs(verticalOffset) == appBarLayout.getTotalScrollRange()) {
                    // Collapsed
                } else if (verticalOffset == 0) {
                    // Expanded
                } else {
                    // Somewhere in between
                }
            }
        }););
    
    0 讨论(0)
  • 2020-12-04 17:14
    appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() 
    {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset)
     {
    
                if (Math.abs(verticalOffset)-appBarLayout.getTotalScrollRange() == 0)
                {
                    //  on Collapse
                }
                else
                {
                   //  on expand
                }
            }
        });
    
    0 讨论(0)
  • 2020-12-04 17:21

    Take a look over this github gist

    public class MyAppBarLayout extends AppBarLayout
            implements AppBarLayout.OnOffsetChangedListener {
    
        private State state;
        private OnStateChangeListener onStateChangeListener;
    
        public MyAppBarLayout(Context context) {
            super(context);
        }
    
        public MyAppBarLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        protected void onAttachedToWindow() {
            super.onAttachedToWindow();
            if (!(getLayoutParams() instanceof CoordinatorLayout.LayoutParams)
                    || !(getParent() instanceof CoordinatorLayout)) {
                throw new IllegalStateException(
                        "MyAppBarLayout must be a direct child of CoordinatorLayout.");
            }
            addOnOffsetChangedListener(this);
        }
    
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            if (verticalOffset == 0) {
                if (onStateChangeListener != null && state != State.EXPANDED) {
                    onStateChangeListener.onStateChange(State.EXPANDED);
                }
                state = State.EXPANDED;
            } else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) {
                if (onStateChangeListener != null && state != State.COLLAPSED) {
                    onStateChangeListener.onStateChange(State.COLLAPSED);
                }
                state = State.COLLAPSED;
            } else {
                if (onStateChangeListener != null && state != State.IDLE) {
                    onStateChangeListener.onStateChange(State.IDLE);
                }
                state = State.IDLE;
            }
        }
    
        public void setOnStateChangeListener(OnStateChangeListener listener) {
            this.onStateChangeListener = listener;
        }
    
        public interface OnStateChangeListener {
            void onStateChange(State toolbarChange);
        }
    
        public enum State {
            COLLAPSED,
            EXPANDED,
            IDLE
        }
    }
    
    0 讨论(0)
  • 2020-12-04 17:25
     appBarLayout.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset ->
    
            if (Math.abs(verticalOffset)  >= appBarLayout.totalScrollRange) { // collapse
            } else if (verticalOffset == 0) { // fully expand
    
            } else { // scolling
    
            }
        })
    

    appBarLayout.totalScrollRange is not always equal to verticalOffset in some case, better check verticalOffset larger than totoalScrollRange

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