【问题标题】:Disabling & Enabling Paging In ViewPager in Android在 Android 的 ViewPager 中禁用和启用分页
【发布时间】:2011-11-15 09:48:24
【问题描述】:

我正在使用 android 兼容包版本 4 在我的应用程序中显示 pdf 页面。 我使用 PagerAdapter 和 ViewPager 来显示 pdf 页面,如水平滚动视图。

现在问题出在与分页相关的东西上。我可以通过根据这个线程android: ViewPager and HorizontalScrollVIew 检测视图分页器内的子项来停止分页,但是当用户在该视图之外触摸时,我怎样才能启用它。我为 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 中继续分页。

【问题讨论】:

标签: android android-viewpager


【解决方案1】:

我在分页图像文件时遇到了类似的问题,需要捏合来缩放。简单地说,需要一种在放大图像时禁用分页并在显示整个图像时启用它的方法。我像这样解决了它,并认为你可以做类似的事情。 首先扩展:类 MyViewPager 扩展 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 布局或从代码动态创建中使用您的视图分页器。

【讨论】:

    【解决方案2】:
    @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

    【讨论】:

      【解决方案3】:

      您将其设置为 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;
          }
      

      【讨论】:

        猜你喜欢
        • 2013-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多