¿Es posible tener un ViewPager dentro de un ScrollView?

Estoy intentando utilizar un ViewPager dentro de un ScrollView , pero el ViewPager no aparece. Si ViewPager el ScrollView el ViewPager aparece bien.

He creado un proyecto de prueba simple con lo siguiente:

Layout main.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent"> <android.support.v4.view.ViewPager android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/viewpager" /> </ScrollView> </LinearLayout> 

Clase de actividad:

 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) { } } 

Gracias por tu tiempo.

Lo he descubierto;

Necesitaba agregar android:fillViewport="true" al elemento ScrollView.

Sí, es posible tener viewpager dentro de scrollview.

Utilice debajo del código y usted alcanzará su meta, he hecho iguales en mi código también.

  public class WrapContentHeightViewPager extends ViewPager { public WrapContentHeightViewPager(Context context) { super(context); } public WrapContentHeightViewPager(Context context, AttributeSet 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; } 

Espero que esto ayude a alguien a resolver problemas de desplazamiento con ViewPager anidado dentro de ScrollView.

Este trabajo de soloution para mí, con dinamically contenido

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

En el xml scrollview poner android:fullViewPorts=true y android:layout_height=wrap_content

En el viewpager personalizado, también android:layout_height=wrap_content

¿Por qué estás tratando de hacer esto? La forma más natural sería envolver cada página en un ScrollView si es necesario.

  • ScrollView con botones en el interior, sin respuesta hasta el segundo clic en cualquier botón dentro
  • Evento de desplazamiento para recyclerview inside scrollview android
  • Webview en Scrollview
  • Diseño relativo en ScrollView
  • Detectar cuándo scrollView se ha desplazado
  • ¿Hay alguna forma de calcular la posición final de desplazamiento
  • Ver contenido a continuación ExpandableListView
  • RelativeLayout dentro de scrollview no se desplaza
  • Cómo cambiar el tamaño de Android ScrollView
  • Cómo crear un número variable de vistas de texto en android
  • Desplazamiento con varios ListViews para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.