我有自定义的自定义 ViewPager,其中包含带有 ScrollView 的片段。在某些情况下我需要禁用 ViewPager,所以我在 onTouchEvent 和 onInterceptTouchEvent 方法中实现了它:
public class NonSwipeableViewPager extends ViewPager {
private static final String TAG = NonSwipeableViewPager.class.getSimpleName();
private boolean isEnabled;
private float initialX;
public NonSwipeableViewPager(Context context) {
super(context);
isEnabled = false;
}
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
isEnabled = false;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE: {
Log.d(TAG, "onTouchEvent: move");
float currentX = ev.getX();
// disable right swipe
if (initialX - currentX < 0) {
return false;
}
break;
}
}
return super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN: {
Log.d(TAG, "onInterceptTouchEvent: down");
initialX = ev.getX();
break;
}
case MotionEvent.ACTION_MOVE: {
Log.d(TAG, "onInterceptTouchEvent: move");
}
}
if (isEnabled) {
return onTouchEvent(ev);
} else {
return false;
}
}
public void setEnabled(boolean isEnabled) {
this.isEnabled = isEnabled;
}
public boolean isEnabled() {
return isEnabled;
}
}
只要 isEnabled 为 false,ScrollView 就可以正常工作。但是当它为真时,ScrollView 被禁用并且所有的触摸事件只影响 ViewPager。
我试图区分 onInterceptTouchEvent 中的垂直和水平移动事件,但日志看起来像:
onInterceptTouchEvent: down
onTouchEvent: move
onTouchEvent: move
onTouchEvent: move
...
所以我不能在 onInterceptTouchEvent 中做到这一点,也无法从 OnTouchEvent 到达 ScrollView。
启用 ViewPager 后,我可以做些什么来使 ScrollView 和 ViewPager 一起工作?
片段.xml:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/activity_horizontal_margin">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/text2"
android:layout_below="@id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
</ScrollView>
活动.xml:
<?xml version="1.0" encoding="utf-8"?>
<com.example.vlad.vocabimprover.testex.NonSwipeableViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_height="match_parent"
android:layout_width="match_parent"/>