Est-il possible d’avoir un ViewPager dans un ScrollView?

J’essaie d’utiliser un ViewPager dans un ScrollView , mais le ViewPager n’apparaît pas. Si je supprime le ScrollView le ViewPager semble bien.

J’ai créé un projet de test simple avec les éléments suivants:

mise en page main.xml:

       

Classe d’activité:

 public class ScrollViewWithViewPagerActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ViewPager vp = (ViewPager) findViewById(R.id.viewpager); vp.setAdapter(new MyPagerAdapter(this)); } } class MyPagerAdapter extends PagerAdapter { private Context ctx; public MyPagerAdapter(Context context) { ctx = context; } @Override public int getCount() { return 2; } @Override public Object instantiateItem(View collection, int position) { TextView tv = new TextView(ctx); tv.setTextSize(50); tv.setTextColor(Color.WHITE); tv.setText("SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, " + "SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, " + "SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, " + "SMILE DUDE, SMILE DUDE, SMILE DUDE"); ((ViewPager) collection).addView(tv); return tv; } @Override public void destroyItem(View collection, int position, Object view) { ((ViewPager) collection).removeView((View) view); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Parcelable saveState() { return null; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public void startUpdate(View arg0) { } @Override public void finishUpdate(View arg0) { } } 

Merci pour votre temps.

J’ai compris

Je devais append android:fillViewport="true" à l’élément ScrollView.

Oui, il est possible d’avoir un viewpager dans scrollview.

Utilisez le code ci-dessous et vous atteindrez votre objective, j’ai également fait la même chose dans mon code.

  public class WrapContentHeightViewPager extends ViewPager { public WrapContentHeightViewPager(Context context) { super(context); } public WrapContentHeightViewPager(Context context, AtsortingbuteSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int height = 0; for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); child.measure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); int h = child.getMeasuredHeight(); if (h > height) height = h; } heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } @Override public boolean onTouch(View v, MotionEvent event) { int dragthreshold = 30; int downX = 0; int downY = 0; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = (int) event.getRawX(); downY = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: int distanceX = Math.abs((int) event.getRawX() - downX); int distanceY = Math.abs((int) event.getRawY() - downY); if (distanceY > distanceX && distanceY > dragthreshold) { mViewPager.getParent().requestDisallowInterceptTouchEvent(false); mScrollView.getParent().requestDisallowInterceptTouchEvent(true); } else if (distanceX > distanceY && distanceX > dragthreshold) { mViewPager.getParent().requestDisallowInterceptTouchEvent(true); mScrollView.getParent().requestDisallowInterceptTouchEvent(false); } break; case MotionEvent.ACTION_UP: mScrollView.getParent().requestDisallowInterceptTouchEvent(false); mViewPager.getParent().requestDisallowInterceptTouchEvent(false); break; } return false; } 

J’espère que cela aide quelqu’un à résoudre les problèmes de défilement avec ViewPager nested dans un ScrollView.

cette soloution travaille pour moi, avec un contenu dinamical

http://www.henning.ms/2013/09/09/viewpager-that-simply-dont-measure-up/

dans le xml scrollview mettre android:fullViewPorts=true et android:layout_height=wrap_content

dans le visualiseur personnalisé, aussi android:layout_height=wrap_content

Pourquoi essayez-vous de faire ça? La manière la plus naturelle serait d’envelopper chaque page dans un ScrollView si vous en avez besoin.