Установка высоты представлений в окне Scrollview в android

Я должен показать viewpager (изображение и текст под изображением в строке пейджера) внутри scrollview. Я загружаю изображение, текст из Интернета и показываю строки в пейджерах. Я обернул viewpager внутри srollview для поддержки ландшафтного режима.

<com.xxx.myapp.android.ui.CustomScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:fadingEdge="none" android:fillViewport="true" android:gravity="center"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:descendantFocusability="blocksDescendants" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="800dp" android:layout_gravity="top" android:layout_marginTop="10dp" /> </LinearLayout> </com.xxx.myapp.android.ui.CustomScrollView> 

И вот CustomScrollView . Проблема заключается в том, как настроить высоту представления пейджера на основе его высоты детей, чтобы я мог прокручивать экран до тех пор, пока не будет только объект пейджера. Если я установил высоту представления пейджера в wrapcontent, ничего не отображается в viewpager. Если я установил 800dp, то я увижу элементы пейджера, но на экране нет необходимости прокручивать. Я не хочу, чтобы прокрутка прокручивалась за пределы высоты детских пейджеров. Пожалуйста, помогите мне.

Оберните свою строку пейджера внутри CustomScrollView вместо того, чтобы обернуть пейджер внутри CustomScrollview. И не фиксируйте высоту Viewpager, как прокомментировал Пиюш Гупат. Используйте wrapcontent.

Чтобы исправить высоту viewpager, мы можем настроить класс viewpager.

 public class WrapContentViewPager extends ViewPager { private int mCurrentPagePosition = 0; public WrapContentViewPager(Context context) { super(context); } public WrapContentViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { try { View child = getChildAt(mCurrentPagePosition); if (child != null) { child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); int h = child.getMeasuredHeight(); heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY); } } catch (Exception e) { e.printStackTrace(); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } public void reMeasureCurrentPage(int position) { mCurrentPagePosition = position; requestLayout(); } } 

Где этот reMeasureCurrentPage должен вызываться в viewpager onPageSelected callback.and CustomScrollView является родительским представлением.

 mViewPager = new ViewPager(mContext) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); View view = getChildAt(this.getCurrentItem()); if (view != null) { view.measure(widthMeasureSpec, heightMeasureSpec); } setMeasuredDimension(getMeasuredWidth(), measureHeight(heightMeasureSpec, view)); } private int measureHeight(int measureSpec, View view) { int result = 0; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.EXACTLY) { result = specSize; } else { // set the height from the base view if available if (view != null) { result = view.getMeasuredHeight(); } if (specMode == MeasureSpec.AT_MOST) { result = Math.min(result, specSize); } } return result; } }; 

Попробуйте этот путь

 <com.xxx.myapp.android.ui.CustomScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:fadingEdge="none" android:fillViewport="true" android:gravity="center"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="top" android:layout_marginTop="10dp" /> </LinearLayout> </com.xxx.myapp.android.ui.CustomScrollView>