AppBarLayout使用问题记录

问题一:AppBarLayout区域无法滑动

此问题可能会出现在AppBarLayout+ViewPager一起使用,并且AppbarLayout区域过大时,偶尔无法滑动问题

解决:

mAppbarLayout.post(new Runnable() {
            @Override
            public void run() {
                CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppbarLayout.getLayoutParams();
                AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
                behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
                    @Override
                    public boolean canDrag(AppBarLayout appBarLayout) {
                        return true;
                    }
                });
            }
        });

问题二:AppBarLayout下方区域无法点击、卡顿、抖动等问题

此问题出现在AppBarLayout配合NestedScollView或者RecyclerView使用时,快速滑动界面后,会出现一段时间内appBar下方无法响应点击、卡顿、抖动等问题,这是android的一个原生bug,在28.0以上修复了这个bug,在28.0一下使用如下方法解决:

解决:

创建如下一个类

public class FixAppBarLayoutBehavior extends AppBarLayout.Behavior {
    public FixAppBarLayoutBehavior() {
        super();
    }

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

    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target,
                               int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed,
                dxUnconsumed, dyUnconsumed, type);
        stopNestedScrollIfNeeded(dyUnconsumed, child, target, type);
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child,
                                  View target, int dx, int dy, int[] consumed, int type) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
        stopNestedScrollIfNeeded(dy, child, target, type);
    }

    private void stopNestedScrollIfNeeded(int dy, AppBarLayout child, View target, int type) {
        if (type == ViewCompat.TYPE_NON_TOUCH) {
            final int currOffset = getTopAndBottomOffset();
            if ((dy < 0 && currOffset == 0)
                    || (dy > 0 && currOffset == -child.getTotalScrollRange())) {
                ViewCompat.stopNestedScroll(target, ViewCompat.TYPE_NON_TOUCH);
            }
        }
    }

}

在使用AppBarlayout的地方加上 app:layout_behavior="yourFixAppBarLayoutBehaviorUrl" ,yourFixAppBarLayoutUrl为你的类的绝对地址,如com.myapp.FixAppBarLayoutBehavior。

 

你可能感兴趣的:(AppBarLayout使用问题记录)