ViewPager中的NumberPicker会导致水平滑动

时间:2012-10-27 10:04:30

标签: android android-viewpager swipe 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];
        }
    }

并且Fragment布局包含NumberPicker:

   <NumberPicker
        android:id="@+id/numberPicker1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

2 个答案:

答案 0 :(得分:1)

通过扩展自定义ViewPager并实现dispatchTouchEvent。

我们开始跟踪ACTION_DOWN中的触摸(在场景上的像素位置)。当我们看到它是水平滑动时,我们不会调用super.dispatchTouchEvent( event ) - 这将执行默认的onTouch路由并使NumberPicker也使用水平滑动 - 但在onTouchEvent( event )中调用ACTION_MOVE以及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 );
}

}

答案 1 :(得分:1)

我知道这是超老的,但它仍然是第一个搜索结果,因此我想为将来的访客提供答案。

问题确实是NumberPicker内部的EditText。如果您在ViewPager中使用任何其他EditText,也会发生这种滑动阻止。

为解决此问题,您必须以编程方式禁用EditText的水平滚动(由于Android> _ <,因此无法使用XML进行滚动)。

首先找到NumberPicker的EditText的android的内部ID,然后将其水平滚动设置为false:

int editTextId = Resources.getSystem().getIdentifier(
    "numberpicker_input", "id", "android");
((EditText) numberPicker.findViewById(editTextId)
    ).setHorizontallyScrolling(false);