繁体   English   中英

2 ViewPager在Android 2.3中不滚动

[英]2 ViewPager not scrolling in Android 2.3

我在我的应用程序中使用导航抽屉,其中包含一些碎片,如下图所示。

在此输入图像描述

每个片段包含另一个ViewPager,它是一个ImageSlider,下面是Listview,在顶部我使用的是SwipeRefreshLayout。 我的问题是图像滑块在Android 3.0或更高版本的设备上运行良好,但向左或向右滑动不适用于设备2.3及更低版本,而是调用父ViewPager的滑动,即导航片段。 我正在使用支持版本4库来支持低于3.0的设备。 除了那一个,所有功能在2.3设备上运行良好。 我用谷歌搜索了它,但我在任何地方都没有找到任何帮助。 因此,为了让它滚动我应该为此做什么,任何想法/帮助将受到高度赞赏。

您可以将此ViewPager用作父ViewPager 这允许子ViewPager滚动。

public class CustomViewPager extends ViewPager {

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


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


    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        try {
            //Handle the issue only in lower versions of android
            if (v != this && v instanceof ViewPager && CJRAppCommonUtility.getOSVersion() < android.os.Build.VERSION_CODES.HONEYCOMB) {
                ViewPager viewPager = (ViewPager) v;
                int currentPage = viewPager.getCurrentItem();
                int size = viewPager.getAdapter().getCount();
                //if ViewPager has reached its end and if user tries to swipe left allow the parent to scroll
                if (currentPage == (size - 1) && dx < 0) {
                    return false;
                }
                //if ViewPager has reached its start and if user tries to swipe right allow the parent to scroll
                else if (currentPage == 0 && dx > 0) {
                    return false;
                } 
                //Allow the child to scroll hence blocking parent scroll
                else {
                    return true;
                }
            } 
            return super.canScroll(v, checkV, dx, x, y);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

关于在Viewgroup处理触摸事件,Android开发者网站有一个很好的解释。 您可以在此处参考: http//developer.android.com/training/gestures/viewgroup.html

希望能帮助到你!!

在旧版本的Android中,requestDisallowInterceptTouchEvent不起作用。 这里的解决方案是扩展视图寻呼机并覆盖onInterceptTouchEvent并存储可滚动的子列表。 然后,当调用onInterceptTouchEvent时,您可以遍历可滚动子项列表,获取其命中rect,并查看触摸事件是否在命中rect内。 如果是,你可以返回false以不处理它并让孩子接受它。

像这样的东西:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
    for (View view : scrollableChildren)
    {
        // get the hit rectangle for the view
        Rect rect = new Rect();
        view.getHitRect(rect);

        // check to see if the click was inside this child
        if (rect.contains((int) ev.getX(), (int) ev.getY()))
        {
            return false;
        }
    }

    return super.onInterceptTouchEvent(ev);
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM