无法使ViewPager和ScrollView协同工作

时间:2017-03-03 15:48:54

标签: android android-viewpager android-scrollview android-touch-event

我有自定义的自定义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"/>

0 个答案:

没有答案