【问题标题】: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);
}
}