为了账号安全,请及时绑定邮箱和手机立即绑定

coordinatelayout+appbar+viewpage踩过来的坑

标签:
Html/CSS

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


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消