我一直在使用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" />
答案 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);