在Android中禁用和启用ViewPager的分页功能

13

我正在使用Android兼容性包版本4,在我的应用程序中显示PDF页面。我已经使用PagerAdapter和ViewPager来显示PDF页面,就像水平滚动视图一样。

现在问题出在分页方面。我能够通过检测ViewPager内部的子项停止分页,就像这个线程中所述,但是当用户触摸该视图之外时,如何重新启用分页呢?我已经在CustomViewPager中使用了以下代码。

public class CustomViewPager extends ViewPager {

        private boolean enabled;
        private int childId;

        public CustomViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.enabled = true;
        }

        public void setChildId(int childId) {
            this.childId = childId;
        }

        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            boolean result = false;
            View scroll = getChildAt(childId);
            if (scroll != null) {
                Rect rect = new Rect();
                CommonLogic.logMessage("PDF Page Rectangle  ", TAG, Log.VERBOSE);
                scroll.getHitRect(rect);
                if (rect.contains((int) event.getX(), (int) event.getY())) {
                    setPagingEnabled(false);
                    result = true;
                }
            }
            return result;
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (this.enabled) {
                return super.onTouchEvent(event);
            }
            return false;
        }

        public void setPagingEnabled(boolean enabled) {
            this.enabled = enabled;
        }
    }
当尝试触摸超出PDF页面时,无论是横向还是纵向,if(scroll!=null)都会变为true。
请问有人能帮我解决问题,以便重新启用ViewPager中的分页功能。

1
你尝试过这个吗:https://dev59.com/XHE85IYBdhLWcg3wtV71#2655740 - Warpzit
3个回答

3

我有一个与需要缩放的图像文件分页类似的问题。简单来说,我需要一种方式在图像被缩放时禁用分页,在整个图像显示时启用它。我像这样解决了它,并认为您也可以做类似的事情。 首先扩展:class MyViewPager extends ViewPager {...} 然后在该类中覆盖以下两种方法

    @Override
public boolean onTouchEvent(MotionEvent event) {
    if (YOUR_CRITERIA_TOENABLE_DISABLE) {
        return true;

    } else {
        return super.onTouchEvent(event);
    }
}

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

请务必在xml布局或通过代码动态创建中使用您的视图分页器。


1
@Override
public boolean onTouchEvent(MotionEvent event) {
     if (this.enabled) {
           return super.onTouchEvent(event);
     }
     return false;
}

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

将“return false”替换为“return this.enable”,并将this.enable的默认值设置为false。

0
你将它设置为 false,但没有重置回 true 的情况。此外,你的拦截触摸逻辑似乎有些奇怪... 唯一允许页面拦截(并因此在 onTouchEvent() 中处理)的时间是当你将分页启用设置为 false 时。以下方案如何?
 @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        boolean result = true;
        View scroll = getChildAt(childId);
        if (scroll != null) {
            Rect rect = new Rect();
            CommonLogic.logMessage("PDF Page Rectangle  ", TAG, Log.VERBOSE);
            scroll.getHitRect(rect);
            if (rect.contains((int) event.getX(), (int) event.getY())) {
                setPagingEnabled(false);
                result = false;
            } else {
                setPagingEnabled(true);
            }
        }
        return result;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接