问题一: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。
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="com.myapp.FixAppBarLayoutBehavior">