禁用Android ViewPager滚动,同时仍然允许它的孩子滚动

时间:2015-03-09 02:59:12

标签: android android-viewpager ontouchevent

我有一个带有网页视图的viewpager,可以向左和向右滚动。 用户可以拥有未保存的数据,在这种情况下我想禁用viewpager,如果用户试图滚动页面,我想显示一个未保存的对话窗口。

I looked at this solution但它并不是我需要的东西。由于始终返回true将禁用我的片段的webview也不会滚动。

public class CustomViewPager extends ViewPager {

private boolean isPagingEnabled = true;

public CustomViewPager(Context context) {
    super(context);
}

public CustomViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return this.isPagingEnabled && super.onTouchEvent(event);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return this.isPagingEnabled && super.onInterceptTouchEvent(event);
}

public void setPagingEnabled(boolean b) {
    this.isPagingEnabled = b;
}
}

目前,我有一个自定义webview,我覆盖onTouch,并检查我是否可以水平滚动。我有一个方法可以检查我的webview是否可以向左或向右滚动。这似乎工作正常。

    public boolean canScrollHorizontally(int direction){
        final int offset = computeHorizontalScrollOffset();
        final int range = computeHorizontalScrollRange() -computeHorizontalScrollExtent();
        if (range == 0) return false;
        if (direction < 0) {
            return offset > 0;
        } else {
            return offset < range - 1;
        }
}

我的网页浏览器上有一个ontouch监听器,我相信它工作正常吗?如果我返回true,如果用户尝试向左拖动并且视图有空间可以拖动。如果没有,我返回false,希望将事件传递给viewpager。

    public boolean onTouchEvent(MotionEvent event) {
    float x;
    float y;
    x = event.getX();
    y = event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mStartDragX = x;
            mStartDragY = y;
            break;
        case MotionEvent.ACTION_MOVE:
                if(Math.abs(mStartDragX - ev.getX()) > SWIPE_MIN_DISTANCE){

                if (mStartDragX < x && canScrollHorizontally(-1)) {
                    // Left to Right
                    return true;
                } else if(mStartDragX > x && canScrollHorizontally(1)){
                    // Right to Left
                    return true;
                }else{
                    // pass to viewpager?
                    return false;
                }
         }
    }
    return super.onTouchEvent(event);
}

我的viewtager的ontouch事件是我迷失了一点,如果Pager被禁用了。我想向用户显示一个对话框。

@Override
public boolean onTouchEvent(MotionEvent ev) {
    float x;
    float y;
    if(this.enabled) {
        return super.onTouchEvent(ev);
    } else{
        x = ev.getX();
        y = ev.getY();
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mStartDragX = x;
                mStartDragY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                if(Math.abs(mStartDragX - ev.getX()) > SWIPE_MIN_DISTANCE){
                    showDialog()??
                }
        }
    }
    return true;
}

有人可以提出最佳方法吗?

1 个答案:

答案 0 :(得分:0)

你可以实现这一目标的一种可能方法是改变驱动ViewPager的PagerAdapter的状态,以便它只显示一个视图 - 被锁定的视图。解锁时,您将回滚PagerAdapter以获得所有视图。这项工作的诀窍是仔细实施getItemPosition(),以便您锁定的网页不会被删除并重新添加。

例如:

public void setLocked(boolean isLocked) {
    mIsLocked = isLocked;
    notifyDataSetChanged();
}

@Override
public int getCount() {
    return mIsLocked ? 1 : mViews.size();
}

我遇到过一种情况,即视图的添加/删除/重新排序非常复杂,我最终编写了一个完整的PagerAdapter实现。