继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

coordinatelayout+appbar+viewpage踩过来的坑

慕标5832272
关注TA
已关注
手记 1222
粉丝 229
获赞 1001

1.底部的viewpage包含的Fragment中,布局不支持listview 、scrollview等常规View。需要使用RecycleView或者NestScrollview

2.如果recycleview没有设置adapter,那么只能上滑、不能下滑

3.关于viewpage滑动惯性的问题,可以重写behavior,在xml中配置给appbar
这个问题在design25.0.0是没有的 但是26就有问题

import android.content.Context;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.OverScroller;

import java.lang.reflect.Field;

/**

  • Created by kevin on 2018/8/8.
    */
    public class CustomBehavior extends AppBarLayout.Behavior {
    private OverScroller mScroller;

    public CustomBehavior() {
    }

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

    /**

    //fling上滑appbar然后迅速fling下滑recycler时, HeaderBehavior的mScroller并未停止, 会导致上下来回晃动
    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) {
    if (mScroller != null) { //当recyclerView 做好滑动准备的时候 直接干掉Appbar的滑动
    if (mScroller.computeScrollOffset()) {
    mScroller.abortAnimation();
    }
    }
    if (type == ViewCompat.TYPE_NON_TOUCH && getTopAndBottomOffset() == 0) { //recyclerview的惯性比较大 ,会顶在头部一会儿, 到头直接干掉它的滑动
    ViewCompat.stopNestedScroll(target, type);
    }
    super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
    }

    @Override
    public boolean onTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent e) {

     switch (e.getActionMasked()) {     case MotionEvent.ACTION_DOWN:         break;
     } return super.onTouchEvent(parent, child, e);

    }

    • 反射获得滑动属性。


    • @param context
      */
      private void getParentScroller(Context context) {
      if (mScroller != null) return;
      mScroller = new OverScroller(context);
      try {
      Class<?> reflex_class = getClass().getSuperclass().getSuperclass();//父类AppBarLayout.Behavior父类的父类HeaderBehavior
      Field fieldScroller = reflex_class.getDeclaredField("mScroller");
      fieldScroller.setAccessible(true);
      fieldScroller.set(this, mScroller);
      } catch (Exception e) {
      }
      }

}



作者:月亮的后羿
链接:https://www.jianshu.com/p/b9972a054aaf


打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP