5

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

我面临的一个大问题是,当尝试滑动查看器时,它可以在除 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" />
4

2 回答 2

2

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

我们开始跟踪触摸(屏幕上的像素位置)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 );
}

}

于 2017-06-10T13:15:52.283 回答
1

我知道这是超级旧的,但它仍然是第一个搜索结果,所以我想我会为未来的访问者回答它。

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

要解决此问题,您必须以编程方式禁用 EditText 的水平滚动(在 XML 中执行此操作不起作用,因为 Android >_<)。

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

int editTextId = Resources.getSystem().getIdentifier(
    "numberpicker_input", "id", "android");
((EditText) numberPicker.findViewById(editTextId)
    ).setHorizontallyScrolling(false);
于 2019-01-21T00:45:57.220 回答