我正在使用ViewPager
和WebView
将HTML
内容呈现为电子书。在ViewPager的某些页面上,我允许WebView处理TouchEvent
,在某些页面上,我让ViewPager通过覆盖TouchEvent
方法来处理onInterceptTouchEvent
。 ViewPager
(某些网页上有TextViews
和Buttons
没有WebView
第1页和最后一页。这是相同的代码 -
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (getCurrentItem() == 0 || getCurrentItem() == getAdapter().getCount() - 1)
return false;
else {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
return false;
}
return true;
}
}
我再次通过使用以下代码在OnTouchListener
上设置WebView
来禁止滚动 -
contentView.setOnTouchListener((v, event) -> {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_MOVE) {
((BigBeeViewPager) v.getParent().getParent()).onInterceptTouchEvent(event);
}
return true;
});
我面临的问题是 - 当我尝试从页面中间滑动ViewPager时,它无法正常工作。我必须从页面末尾开始滑动。但是对于没有WebView
的页面,它可以正常工作
如何允许它从页面中的任何位置开始滑动。
此行为类似于 Gmail Android App ,其中ViewPager
包含WebView,并且可以从任何位置使用Swiping。我无法弄清楚他们是如何做到的。
注意 - 当我拦截所有TouchEvent
到WebView
时,它也会禁用长按和文本选择,这是不可取的。
提前感谢您的帮助。
答案 0 :(得分:5)
在这里你走人 - 一个很好的解决方案的老问题。
答案 1 :(得分:1)
然而MarkySmarky对于找出解决方案非常有帮助,但我仍然想写下答案部分,以便其他人可以获得帮助。
我通过覆盖方法
解决了这个问题protected boolean canScroll(View v, boolean checkV, int dx, int x, int y)
ViewPager
的,如果false
是v
的实例,则返回WebView
。这不是让WebView
滚动本身,因此ViewPager
将其视为非滚动子项,因此可以从页面的任何位置进行滑动。
最后我的ViewPager
看起来像 -
public class BigBeeViewPager extends ViewPager {
public BigBeeViewPager(Context context) {
super(context);
}
public BigBeeViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
return !(v instanceof ObservableWebView) && super.canScroll(v, checkV, dx, x, y);
}
}
答案 2 :(得分:0)
您已创建GestureDetector
并在Webview
上执行此操作:
GestureDetector gestureDetector=new GestureDetector(new GestureDetector.OnGestureListener() {
@Override
public boolean onDown(MotionEvent motionEvent) {
return false;
}
@Override
public void onShowPress(MotionEvent motionEvent) {
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
return false;
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
return false;
}
@Override
public void onLongPress(MotionEvent motionEvent) {
}
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
return false;
}
});
webView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
if (!v.hasFocus()) {
v.requestFocus();
}
break;
}
gestureDetector.onTouchEvent(event);
return false;
}
});
从Interceptor
中移除Viewpager
并使用默认值而不做任何更改