ViewPager中的NumberPicker取消了水平滑动

Waz*_*_Be 5 android swipe android-viewpager numberpicker

我使用ViewPager已有很长时间了,今天早上,我试图在ViewPager中包含一个NumberPicker。

我面临的最大问题是,当尝试滑动Viewpager时,除NumberPicker之外,它在任何地方都有效。

我真的不明白这种行为!

例如,一个ListView很好,水平滑动由ViewPager处理,垂直滑动由List处理。我期待与NumberPicker相同。没有理由让NumberPicket处理水平滑动

该代码非常简单,我在这里发布:

    ViewPager mPager = (ViewPager) findViewById(R.id.pager);
    if (mPager != null) 
        mPager.setAdapter(mAdapter);

    ()...
class TabsAdapter extends FragmentPagerAdapter {
        public TabsAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return TITLES.length;
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return new FragmentAccueil();
            case 1:
                return new FragmentRecherche();
            case 2:
                return new FragmentFav();
            }
            return null;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            if (position == 0)
                try {
                    return TITLES[position]+" "+a.getPackageManager().getPackageInfo(
                            a.getPackageName(), 0).versionName;
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    return TITLES[position];
                }
            else
                return TITLES[position];
        }
    }
Run Code Online (Sandbox Code Playgroud)

Fragment布局包含一个NumberPicker:

   <NumberPicker
        android:id="@+id/numberPicker1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)

小智 2

通过扩展它并实现dispatchTouchEvent来创建自定义ViewPager。

我们开始跟踪触摸(使用屏幕上的像素位置)ACTION_DOWN。当我们看到它是水平滑动时,我们不会调用super.dispatchTouchEvent( event )- 这将执行默认的 onTouch 路由并使 NumberPicker 也消耗水平滑动 - 而是调用onTouchEvent( event )inACTION_MOVE和 in ACTION_UP

public class MyViewPager extends ViewPager {

private float mLastX;
private float mLastY;
private final int mTouchSlop = ViewConfiguration.get( getContext() ).getScaledTouchSlop();
private float mStartX;

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

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

@Override
public boolean dispatchTouchEvent( MotionEvent event ) {
    switch( event.getAction() ) {
        case MotionEvent.ACTION_DOWN:
            mLastX = event.getX();
            mLastY = event.getY();
            mStartX = event.getX();
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            onTouchEvent( event );
            break;
        case MotionEvent.ACTION_MOVE:
            float x = event.getX();
            float y = event.getY();

            float xDelta = x - mLastX;
            float xDeltaAbs = Math.abs( xDelta );
            float yDeltaAbs = Math.abs( y - mLastY );

            float xDeltaTotal = x - mStartX;
            if( Math.abs( xDeltaTotal ) > mTouchSlop )
                if( xDeltaAbs > yDeltaAbs )
                    return onTouchEvent( event );
    }

    return super.dispatchTouchEvent( event );
}
Run Code Online (Sandbox Code Playgroud)

}