【问题标题】:Vertical ScrollView inside vertical ViewPager2 not working Android垂直ViewPager2中的垂直ScrollView无法正常工作Android
【发布时间】:2020-11-01 23:49:31
【问题描述】:

我有一个由 2 个Fragments 组成的垂直方向的基本ViewPager2

Fragment 2 里面我有一个垂直的ScrollView

两种垂直滚动都存在冲突,无法正常工作。我知道有很多类似的问题,但我发现和尝试的一切都失败了。

我正在寻找一种可以同时处理两个触摸事件的解决方案。

任何代码示例或线索谢谢

【问题讨论】:

    标签: android scroll android-viewpager scrollview vertical-scrolling


    【解决方案1】:

    我终于通过编写自定义滚动视图来处理垂直滚动来解决我的问题:

    public class CustomScrollView extends NestedScrollView {
    
        public CustomScrollView(@NonNull Context context) {
            super(context);
        }
        public CustomScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
        public CustomScrollView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        float startY, dy;
    
        @Override
        protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
            super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
            if (scrollY > 15) { // 10 - 15 -> avoid fake mouv
                viewPager2.setUserInputEnabled(false);
            }
            else {
                viewPager2.setUserInputEnabled(true);
            }
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
                    startY = ev.getRawY();
            }
            return super.onInterceptTouchEvent(ev);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            switch (ev.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    startY = ev.getRawY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    dy = ev.getRawY() - startY;
                    if (dy > -5 && dy < 70) { // range tested on 5 devices but can be modified
                        return false;
                    }
                    else {
                        viewPager2.setUserInputEnabled(false);
                    }
                    break;
            }
            return super.onTouchEvent(ev);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 2014-08-18
      相关资源
      最近更新 更多