我有自定义的自定义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就可以正常工作。但是当它为true时,ScrollView将被禁用,所有触摸事件仅影响ViewPager。
我试图区分onInterceptTouchEvent中的垂直和水平移动事件,但日志看起来像:
onInterceptTouchEvent: down
onTouchEvent: move
onTouchEvent: move
onTouchEvent: move
...
所以我无法在onInterceptTouchEvent中执行此操作,因此无法从OnTouchEvent访问ScrollView。
启用ViewPager后,我可以做些什么让ScrollView和ViewPager一起工作?
fragment.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>
activity.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"/>