簡體   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